シミュレーションやニューラルネットワーク(ディープラーニング)等で多数の乱数を発生させる必要がある場合は,処理速度等の理由から NumPy の乱数生成 (Random Generator) の使用を推奨します.
ここまで発生させた乱数は,実行ごとに毎回異なる結果になっていたはずです.例えば,次のようなコードを実行するとその都度異なった乱数列が生成される(3回の実行結果を並べています).
サイコロの目
import random # プログラムの先頭でモジュールを読み込む
n = 10
for i in range(n):
die = random.randint(1,6)
print(die, end=" ")
3 4 3 5 3 6 1 2 2 6
5 4 2 1 4 4 4 1 1 4
6 6 3 2 3 6 2 4 2 4
しかしながらプログラムのデバッグ中やシミュレーションでは,乱数に再現性をもたせて毎回同じ乱数列を発生させたいような状況もあります.このような場合には,random.seed(引数)
をプログラムの先頭で実行すると良いでしょう.この関数に適当な引数(整数,実数,文字列など)を与えると,乱数生成器が初期化されて毎回同じ乱数列が出力されることになります.例えば,random.seed(1)
で乱数生成器を初期化するプログラムは何度実行しても同じ乱数列が出力されます.
サイコロの目:乱数生成器を1で初期化
# 乱数のシードを設定する(ここを有効にすると毎回同じ乱数列になる)
random.seed(1)
n = 10
for i in range(n):
die = random.randint(1,6)
print(die, end=" ")
2 5 1 3 1 4 4 4 6 4
2 5 1 3 1 4 4 4 6 4
2 5 1 3 1 4 4 4 6 4
もちろん,異なる引数で乱数生成器を初期化すると別の乱数列が出力されます.
サイコロの目:乱数生成器を2で初期化
# 乱数のシードを設定する(ここを有効にすると毎回同じ乱数列になる)
random.seed(2)
n = 10
for i in range(n):
die = random.randint(1,6)
print(die, end=" ")
1 1 1 3 2 6 6 3 3 5
1 1 1 3 2 6 6 3 3 5
1 1 1 3 2 6 6 3 3 5
なお,random.seed(引数)
の引数を省略した場合は,実行時点におけるシステム時刻を用いて乱数生成器が初期化されるので,実行する度に異なる乱数列が得られます.
サイコロの目:乱数生成器をシステム時刻で初期化
# 乱数のシードを初期化する(引数を与えなければ,実行時点でのシステム時刻で初期化される)
random.seed()
n = 10
for i in range(n):
die = random.randint(1,6)
print(die, end=" ")
1 4 2 6 2 4 3 4 1 2
3 4 3 5 1 6 2 5 4 1
3 4 2 6 5 4 1 3 2 3