【NumPy, SciPy】Randomモジュール、NumPy、SciPyでランダムな値を取得する際のランダム(乱数)シードの設定方法[Python]

  • URLをコピーしました!
目次

NumPy、SciPy

前回、PythonのNumPyでジェネレータを使ったランダムな数値の取得方法の紹介と使わない方法との比較を紹介しました。

今回はRandomモジュール、NumPy、SciPyでランダムな値を取得する際のランダム(乱数)シードの設定方法を紹介します。

それでは始めていきましょう。

Randomモジュールでのランダムシードの設定方法

Randomモジュールでランダムシードを設定するには「Random.seed(値)」とします。

import random

num = 10

for _ in range(num):
    random.seed(42)
    print(random.randrange(100))

実行結果
81
81
81
81
81
81
81
81
81
81

この場合、for文で繰り返すごとにランダムシードを同じ値で設定しているため、「random.randrange(100)」としても同じ値が取得されます。

もちろんランダムシードの値を変えると、取得できる値も変わります。

import random

num = 10

for _ in range(num):
    random.seed(21)
    print(random.randrange(100))

実行結果
21
21
21
21
21
21
21
21
21
21

そしてランダムシードを設定してから、複数のランダムな値を取得するとそれぞれ異なる値が取得されますが、ランダムシードを同じ値に設定し直すとまた同じ順で同じ値が取得できます。

import random

cycle = 3
num = 5

for i in range(cycle):
    print(f"Cycle {i}")
    random.seed(42)
    for _ in range(num):
        print(random.randrange(100))

実行結果
Cycle 0
81
14
3
94
35
Cycle 1
81
14
3
94
35
Cycle 2
81
14
3
94
35

NumPyでのランダムシードの設定方法

NumPyでランダムシードを設定する方法はジェネレータを使わない方法と使う方法で異なります。

まずはジェネレータを使わない方法のランダムシードの設定方法を紹介します。

ジェネレータを使わない場合は「np.random.seed(値)」とします。

import numpy as np

cycle = 3
num = 5

for i in range(cycle):
    print(f"Cycle {i}")
    np.random.seed(42)
    for _ in range(num):
        print(np.random.randint(100))

実行結果
Cycle 0
51
92
14
71
60
Cycle 1
51
92
14
71
60
Cycle 2
51
92
14
71
60

Randomモジュールとシード値を同じにしても違う値が取得されるため乱数表が異なるのかもしれません。

ジェネレータを使う場合は「rng = np.random.default_rng(値)」としてインスタンスを生成します。

import numpy as np

cycle = 3
num = 5

for i in range(cycle):
    print(f"Cycle {i}")
    rng = np.random.default_rng(42)
    for val in rng.integers(0, 100, num):
        print(val)

実行結果
Cycle 0
8
77
65
43
43
Cycle 1
8
77
65
43
43
Cycle 2
8
77
65
43
43

ジェネレータを使う場合でも、シード値をRandomモジュールやNumPyでジェネレータと使わない場合と同じ値にしても、取得されるランダムな値は異なることからやはり乱数表が違うのかもしれません。

SciPyでのランダムシードの設定方法

SciPyでランダムな値を取得する関数はNumPyを用いているようで「np.random.seed(値)」でシード値を設定できます。

from scipy import stats

cycle = 3
num = 5

for i in range(cycle):
    print(f"Cycle {i}")
    np.random.seed(42)
    for val in stats.norm.rvs(0, 1, num):
        print(val)

実行結果
Cycle 0
0.4967141530112327
-0.13826430117118466
0.6476885381006925
1.5230298564080254
-0.23415337472333597
Cycle 1
0.4967141530112327
-0.13826430117118466
0.6476885381006925
1.5230298564080254
-0.23415337472333597
Cycle 2
0.4967141530112327
-0.13826430117118466
0.6476885381006925
1.5230298564080254
-0.23415337472333597

次回はNumPyで多項式のカーブフィッティングを行うpolyfitを紹介します。

ではでは今回はこんな感じで。

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

目次