Pythonで疑似乱数を生成する方法|randomモジュールの使い方を徹底解説
多くのコンピュータアプリケーションでは、乱数の生成が必要になります。しかし、コンピュータが生成できるのは「真の乱数」ではなく、あくまで規則性に基づいた疑似乱数です。
Pythonも他のプログラミング言語と同様に疑似乱数ジェネレーターを使用しており、その基盤となっているのは「メルセンヌ・ツイスタ(Mersenne Twister)」というアルゴリズムです。このアルゴリズムは53ビット精度の浮動小数点数を生成し、高速かつスレッドセーフであることが特徴ですが、暗号化用途には適していません。
Pythonの標準ライブラリには random モジュールが含まれており、乱数を扱うためのさまざまな関数が定義されています。本記事では、その主要な関数の使い方をサンプルコードとともに解説します。
シードと内部状態を管理する関数
random.seed()
乱数ジェネレーターを初期化する関数です。random モジュールをインポートした時点で、システム時間をもとに自動的に初期化されます。同じ乱数列を再現したい場合は、int型・str型・bytes型・bytearray型のオブジェクトを指定して再シードできます。
random.getstate()
乱数ジェネレーターの内部状態を取得する関数です。後述の setstate() と組み合わせることで、同じ乱数データを何度でも再現できます。
random.setstate()
getstate() で取得した内部状態を復元(再設定)する関数です。
整数の乱数を生成する関数
random.randrange()
指定した範囲内からランダムな整数を1つ生成します。引数は最大3つ指定可能です。
random.randrange(start, stop, step)
start と step は省略可能で、デフォルト値はそれぞれ0と1です。step を指定すると、連続する数値の間隔を制御できます。
>>> random.randrange(10) 5 >>> random.randrange(10, 20) 17 >>> random.randrange(100, 200, 2) 188
※上記の出力結果はランダムに生成されるため、実行するたびに異なる値になります(以降の例も同様です)。
random.randint()
2つの引数の間にあるランダムな整数を生成します。step 引数がない randrange() と考えると分かりやすいでしょう。開始値は必須です。
>>> random.randint(1, 10) 6 >>> random.randint(100, 200) 134
浮動小数点数の乱数を生成する関数
random.random()
0.0以上1.0未満の範囲でランダムな浮動小数点数を生成します。
>>> random.random() 0.668544544081956
random.uniform()
2つの引数の間にあるランダムな浮動小数点数を返します。引数の大小関係は問われません。
>>> random.uniform(0.5, 1.5) 1.2760281470664903 >>> random.uniform(1, 10) 7.336985794193224 >>> random.uniform(10, 5) 7.817794757786727
シーケンス(文字列・リスト・タプル)を操作する関数
random.choice()
シーケンスから要素を1つランダムに選択します。空のシーケンスを渡すと IndexError が発生します。
>>> random.choice("Tutorialspoint")
'o'
>>> random.choice(range(10))
2
>>> random.choice([15, 31, 6, 29, 55, 5])
55
>>> random.choice((15, 31, 6, 29, 25, 55))
15
random.choices()
リストから複数の要素をランダムに選択します。第1引数にシーケンス、第2引数 k に選択する個数を指定します(重複あり)。
>>> name = "TutorialsPoint" >>> random.choices(name, k=2) ['T', 'o']
random.shuffle()
変更可能なシーケンス(リストなど)の要素をシャッフルし、ランダムな順序に並べ替えます。元のオブジェクト自体が変更される点に注意してください。
>>> num = [10, 20, 30, 40, 50] >>> random.shuffle(num) >>> num [50, 20, 40, 30, 10]
random.sample()
変更不可能なシーケンスにも対応した関数で、元のシーケンスを変更せずに、ランダムに選択した要素のリストを返します(重複なし)。
>>> name = "TutorialsPoint"
>>> nm = random.sample(name, k=2)
>>> name, nm
('TutorialsPoint', ['i', 'a'])
このように、random モジュールには整数・浮動小数点数・シーケンス操作など、目的に応じた多彩な乱数生成関数が用意されています。用途に合わせて適切な関数を選びましょう。
-
Pythonのissubset()関数とは?部分集合の判定方法を実例付きで解説
本記事では、Python標準ライブラリに用意されているissubset()関数の仕組みと使い方について詳しく解説します。 issubset()メソッドは、あるセット(集合)のすべての要素が、引数として渡した別のセットにも含まれている場合にブール値のTrueを返し、1つでも含まれていない要素があればFalseを返します。 下の図では、BはAの部分集合です。もしAとBが同一のセットであれば、両者は互いに部分集合の関係にあるといえます。つまり、両方のセットがまったく同じ要素を持っているということを意味します。 構文 <set 1>.issubset(<set 2>) 戻り値
-
Pythonで乱数を生成する方法を徹底解説!randomモジュールの基本と使い方
Pythonの標準ライブラリには、乱数を生成するための機能がまとめられた random モジュールが用意されています。このモジュールを利用することで、浮動小数点数や整数の乱数、シーケンスからのランダムな要素の取得などを簡単に実現できます。ここでは、よく使われる主要な関数をサンプルコードとともに紹介します。random():0以上1未満の浮動小数点数を生成もっとも基本的な関数が random() です。この関数は、0以上1未満の範囲のランダムな浮動小数点数を返します。>>> import random>>> random.random()0.520470277