1. ホーム
  2. python

[解決済み] NumPyの乱数生成器の現在の種を取得するにはどうすればよいですか?

2023-07-12 01:01:42

質問

以下は、NumPyをインポートし、seedを設定しています。

import numpy as np
np.random.seed(42)

しかし、私はシードを設定することに興味があるわけではなく、むしろそれを読むことに興味があるのです。 random.get_state() はシードを含んでいないようです。その ドキュメント には明らかな答えがありません。

で使用されている現在のシードを取得するにはどうすればよいのでしょうか? numpy.random で使用されている現在のシードを取得するにはどうしたらよいでしょうか?

ある処理の次の繰り返しで、現在のシードを持ち越しで使用したいのですが。

どのように解決するのですか?

簡単に言うと、単純にできない(少なくとも一般的にはできない)のです。

メルセンヌ・ツイスター numpyで使用されるRNGは、2つの 19937 -1の可能な内部状態を持ちますが、単一の64ビット整数はたった2 64 の値しかありません。したがって、すべての RNG 状態を一意の整数シードにマップすることは不可能です。

あなたは ができます。 を使用して、RNG の内部状態を直接取得および設定できます。 np.random.get_state np.random.set_state . の出力は get_state はタプルで、2番目の要素は (624,) の 32 bit 整数配列です。この配列は,RNG のすべての内部状態を表現するのに十分なビット数を持っています (2 624 * 32 2 19937 -1).

が返すタプルは get_state は、再現可能な乱数列を作成するために、種のように使用することができます。例えば

import numpy as np

# randomly initialize the RNG from some platform-dependent source of entropy
np.random.seed(None)

# get the initial state of the RNG
st0 = np.random.get_state()

# draw some random numbers
print(np.random.randint(0, 100, 10))
# [ 8 76 76 33 77 26  3  1 68 21]

# set the state back to what it was originally
np.random.set_state(st0)

# draw again
print(np.random.randint(0, 100, 10))
# [ 8 76 76 33 77 26  3  1 68 21]