web-dev-qa-db-ja.com

一貫して同じランダムなnumpy配列を作成する

別の開発者が、-1、0、または1のいずれかの値を持つ形状のnp配列(100,2000)を返すコードを完了するのを待っています。

それまでの間、同じ特性の配列をランダムに作成して、開発とテストを有利に進めることができます。問題は、このランダムに作成された配列を毎回同じにすることです。そのため、プロセスを再実行するたびに値が変化し続ける配列に対してテストすることはありません。

このように配列を作成できますが、毎回同じになるように作成する方法はありますか。オブジェクトをピクルスにしてピクルスを外すことはできますが、別の方法があるかどうか疑問に思います。

r = np.random.randint(3, size=(100, 2000)) - 1
82
Idr

乱数ジェネレータに固定値をシードするだけです。

numpy.random.seed(42)

これにより、常に同じ乱数シーケンスが取得されます。

78
Sven Marnach

選択したシードでnumpy.random.RandomState()の独自のインスタンスを作成します。 numpy.random.seed()を使用しないでください。ただし、独自のRandomStateインスタンスを渡さない柔軟性のないライブラリを回避する場合を除きます。

[~]
|1> from numpy.random import RandomState

[~]
|2> prng = RandomState(1234567890)

[~]
|3> prng.randint(-1, 2, size=10)
array([ 1,  1, -1,  0,  0, -1,  1,  0, -1, -1])

[~]
|4> prng2 = RandomState(1234567890)

[~]
|5> prng2.randint(-1, 2, size=10)
array([ 1,  1, -1,  0,  0, -1,  1,  0, -1, -1])
172
Robert Kern

ランダムな状態に依存する他の関数を使用している場合、シードを設定して全体をシードすることはできませんが、代わりに関数を作成して番号のランダムリストを生成し、シードを関数のパラメーターとして設定する必要があります。これにより、コード内の他のランダムジェネレーターが妨害されることはありません。

# Random states
def get_states(random_state, low, high, size):
    rs = np.random.RandomState(random_state)
    states = rs.randint(low=low, high=high, size=size)
    return states

# Call function
states = get_states(random_state=42, low=2, high=28347, size=25)
3
mari756h

ランダムジェネレーターのシードと、コード内でいつ/どのように設定されるかを理解することが重要です(シードの数学的な意味の説明については here を確認してください)。

そのためには、次を実行してシードを設定する必要があります。

random_state = np.random.RandomState(seed=your_favorite_seed_value)

その場合、np.randomではなくrandom_stateから乱数を生成することが重要です。つまりやったほうがいい:

random_state.randint(...)

の代わりに

np.random.randint(...) 

randomState()の新しいインスタンスを作成し、基本的にコンピューターの内部時計を使用してシードを設定します。

1
t_sic