今回はPythonで乱数を扱うrandomモジュールについて説明したいと思います。
この記事では、
- randomモジュールの使い方
- randomモジュールの応用的な使い方</li
- randomモジュールで文字列を生成する方法
などといった基本的な内容から、より実践的な内容に関してもやさしく解説していきたいと思います。
※ この記事のコードはPython 3.7で動作確認しました。
本記事を読む前に、Pythonがどんなプログラミング言語なのかをおさらいしておきたい人は次の記事を参考にしてください。
→ Pythonとは?特徴やできること、活用例をわかりやすく簡単に解説
なお、その他のPythonの記事についてはこちらにまとめています。
randomモジュールとは
randomモジュールは、Pythonでランダムな処理が必要な場合に活躍する標準モジュールです。ランダムな要素や乱数を使う操作などはとても便利なので、覚えておいて損はありません。ちなみに乱数とは、サイコロを投げたときのようにどのような数字が出るかわからない数字のことです。
サイコロでは1〜6の範囲ですが、randomモジュールではその範囲を自由に決めることができます。
randomモジュールの使い方
機能について見ていく前に、まずはrandomモジュールのimportを忘れないようにしましょう。
import random
importについて詳しく知りたい方は、こちらの記事をご覧ください。
1未満のfloat型の乱数を取得(random.random)
これは、randomモジュールの中でも一番基本的な関数です。random.random関数は、0.0から1.0の範囲のfloat型の値を返します。
num = random.random() print(num)
実行結果
0.08114641703637393
またこれ以降の結果は、実行するたびにランダムな値に変わっていきます。
指定した範囲の乱数を取得(random.uniform(a,b))
先ほどご紹介したrandom.random関数は0.0<=x<1.0の間のランダムな値xをfloat型として返す関数でした。任意の範囲でランダムに値を返してほしい場合は、random.uniform関数を使用します。
num = random.uniform(2.0,5.0) print(num)
実行結果
3.8989018807071822
第一引数と第二引数の範囲内で、float型の値を返します。
今回の場合、2.0<=x<=5.0の範囲のランダムな値xをfloat型として生成し出力しました。
指定した範囲の整数の乱数を取得(random.randint(a,b))
random.randint関数はrandom.uniform関数と同じく、指定した範囲内でランダムに値を返します。
random.uniform関数との違いは、random.randint関数はfloat型ではなくint型の値を返す所です。
num = random.randint(1,10) print(num)
実行結果
9
引数として渡す値は、10.0や4.0など、整数に変換できる値を渡しましょう。
配列の中身をランダムに取得(random.choice(a))
random.choice関数は、リストや文字列などといった複数の要素を含むシーケンス型オブジェクトを引数に受け取ります。
そして、それらからランダムに一つ要素を返します。
mylist = ["apple", "banana", "melon", "strawberry", "peach", "lemon"] print(random.choice(mylist))
実行結果
melon
こちらのコードでは、6つの要素を持つリストであるmylistからランダムにひとつ、要素を取り出してみました。
このrandom.choice関数の引数として指定したオブジェクトが空であった場合、エラーが発生するので注意しましょう。
配列の中身をシャッフルする方法(random.shuffle(a))
random.shuffle関数も、random.choice関数と同じように引数としてシーケンス型オブジェクトを受け取ります。random.shuffle関数は、受け取ったシーケンス型オブジェクトの要素をランダムにシャッフルします。
戻り値は無く、引数に指定したオブジェクトそのものに変更を加えます。
mylist = ["apple", "banana", "melon", "strawberry", "peach", "lemon"] random.shuffle(mylist) print(mylist)
実行結果
['apple', 'lemon', 'peach', 'banana', 'strawberry', 'melon']
ご覧いただけるように、random.shuffle関数の適用後、mylistの要素の順番が変わっていますね。
randomモジュールの発展的な使い方
数字をランダムに生成したり、シーケンス型オブジェクトの要素をランダムに取り出したり、などといった事は前の章でご紹介しましたね。
今回は、文字列をランダムに生成する方法をご紹介します。その為にはまず、文字列の操作に便利なstringモジュールをimportする必要があります。
import string
randomモジュールとstringモジュールの両方を使用して文字列をランダムに生成してみましょう。今回は、stringモジュールのstring.ascii_lettersとstring.digitsを使います。
string.ascii_lettersはアルファベットの大文字と小文字のすべてを含む文字列です。string.digitsは、0から9までの文字列です。
これら二つを「+」演算子で組み合わせると、このような文字列を作成することが出来ます。
chars = string.ascii_letters + string.digits print(chars)
実行結果
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
そしてrandom.choice関数を使ってcharsからランダムにひとつ要素を取り出してみましょう。
print(random.choice(chars))
実行結果
'T'
random.choice関数が一回しか実行されていないため、ひとつの要素だけが取り出されました。
しかし、n文字のランダムな文字列を生成する為にはn回、random.choice関数を実行する必要があります。そして、取り出されたn個の要素を1つの文字列として組み合わせてみましょう。
n = 5 s = '' mystr = s.join([random.choice(chars) for i in range(n)])
実行結果
qoR4v
こちらのコードでは、5文字のランダムな文字列を作成しました。
joinメソッドは、引数として受け取ったシーケンス型オブジェクトを、joinを呼び出した文字列と足し合わせてつなげて行きます。その文字列は、hoge.joinのhogeの部分ですね。今回の場合、文字列sがその役割を果たしています。
joinメソッドは、シーケンス型オブジェクトを引数に受け取ります。この場合、リスト内包表記を使用しました。
リスト内包表記については、こちらの記事を参照してください。
このままPythonを学び続けて大丈夫?
なぜPythonを学ぶのか?
あなたがPythonを学ぶ理由は何でしょうか?
- Pythonが人気だからとりあえず学んでいる
- AIや機械学習の分野に興味があるから
Pythonは初心者向けの言語と言われています。その理由としてシンプルでわかりやすい構文や、実用的なライブラリが豊富なことが挙げられ、実際に学びやすい言語です。
しかし、もしあなたが機械学習に興味があって、とくに知識も無いまま学習を進めると、挫折する可能性が高いと言えます。
機械学習の分野はプログラミング以外にも、専門的な知識や数学の知識も必要になります。ただなんとなく学習していると早い段階でつまづきやすく、そのまま挫折してしまうなんてことも…。
そのため、挫折しないためには、
- 最適な学習環境を用意する
- 必要なライブラリ・ツールを導入する
- わからないことを質問できるメンターを見つける
などが必要になります。
効率よく学びたいなら、無料カウンセリングがおすすめ
まだまだ知りたいことがたくさんある!
もっと詳しくPythonについて知りたい!
といった悩みや願望を持っている方は、弊社「侍エンジニア」をご利用下さい。
侍エンジニアでは、
- 現役エンジニアによるマンツーマンレッスン
- キャリアアドバイザーによる転職・就職支援
- 業界屈指のフリーランス・起業サポート
を受けることができます。
業界屈指のコンサルタントから、効率的な学習方法や仕事獲得術、今後のキャリアまでさまざまな疑問を相談してみませんか?遠方の方でもオンラインで受講できます!お気軽に受講下さい。
侍エンジニア無料カウンセリングを受ける
まとめ
今回は、randomモジュールの基本的な使い方を解説しました。
random.random関数はよく使われる一般的な関数ですのでぜひ覚えておきましょう。また、発展的な内容にもチャレンジして、より実用的なrandomモジュールの使い方についても学習しました。
では、みなさんもこの記事を通してrandomモジュールについての知識を増やしていってくださいね。