私はPythonでrandom.seed()
が何をするのか少し混乱しています。例えば、なぜ以下の試験は彼らがしていることを(一貫して)しているのでしょうか?
>>> import random
>>> random.seed(9001)
>>> random.randint(1, 10)
1
>>> random.randint(1, 10)
3
>>> random.randint(1, 10)
6
>>> random.randint(1, 10)
6
>>> random.randint(1, 10)
7
これに関する良いドキュメントが見つかりませんでした。
疑似乱数ジェネレータは、値に対して何らかの操作を実行することによって機能します。通常、この値はジェネレータによって生成された前の数値です。ただし、初めてジェネレータを使用するときには、以前の値はありません。
疑似乱数ジェネレータをシードすると、最初の「前の」値が得られます。各シード値は、与えられた乱数発生器に対して生成された値のシーケンスに対応します。つまり、同じシードを2回提供すると、同じ数列が2回得られます。
一般的には、プログラムの各実行を変更する値を乱数ジェネレータに追加します。例えば、現在の時刻はよく使われる種です。これが自動的に行われない理由は、必要に応じて特定のシードを指定して既知の数列を取得できるようにするためです。
他のすべての答えはrandom.seed()の使用を説明するようには思われません。これは簡単な例です( source ):
import random
random.seed( 3 )
print "Random number with seed 3 : ", random.random() #will generate a random number
#if you want to use the same random number once again in your program
random.seed( 3 )
random.random() # same random number as before
>>> random.seed(9001)
>>> random.randint(1, 10)
1
>>> random.seed(9001)
>>> random.randint(1, 10)
1
>>> random.seed(9001)
>>> random.randint(1, 10)
1
>>> random.seed(9001)
>>> random.randint(1, 10)
1
>>> random.seed(9002)
>>> random.randint(1, 10)
3
あなたはこれを試します。 'random.seed'が、このシードに基づいてこれらの値を生成する乱数生成器( 'random.randint()')に値を与えるとしましょう。乱数の絶対必要な特性の1つはそれらが再現可能であるべきであるということです。同じ種を入れると、同じパターンの乱数が得られます。それで、あなたはそれらを最初から正しく生成しています。あなたはそれが違うイニシャルで始まる違うシードを与えます(上記3)。
これで1から10の乱数が次々に生成されます。そのため、1つのシード値に対して1セットの数を仮定することができます。
乱数 前の値に対する操作によって生成されます。
前の値がない場合は、現在の時刻が前の値として自動的に使用されます。 random.seed(x)
を使用して自分自身でこの前の値を提供できます。ここでxは任意の数値または文字列などです。
したがって、random.random()
は実際には完全な乱数ではなく、random.seed(x)
で予測できます。
import random random.seed(45) #seed=45
random.random() #1st Rand value=0.2718754143840908 0.2718754143840908
random.random() #2nd Rand value=0.48802820785090784 0.48802820785090784
random.seed(45) # again reasign seed=45
random.random() 0.2718754143840908 #matching with 1st Rand value
random.random() 0.48802820785090784 #matching with 2nd Rand value
したがって、乱数の生成はアルゴリズム上で実行されるため、実際には乱数ではありません。アルゴリズムは、常に同じ入力に基づいて同じ出力を生成します。これは、種子の価値によります。そのため、よりランダムにするために、時間は自動的にseed()
に割り当てられます。
Seed() can be used for later use ---
Example:
>>> import numpy as np
>>> np.random.seed(12)
>>> np.random.Rand(4)
array([0.15416284, 0.7400497 , 0.26331502, 0.53373939])
>>>
>>>
>>> np.random.seed(10)
>>> np.random.Rand(4)
array([0.77132064, 0.02075195, 0.63364823, 0.74880388])
>>>
>>>
>>> np.random.seed(12) # When you use same seed as before you will get same random output as before
>>> np.random.Rand(4)
array([0.15416284, 0.7400497 , 0.26331502, 0.53373939])
>>>
>>>
>>> np.random.seed(10)
>>> np.random.Rand(4)
array([0.77132064, 0.02075195, 0.63364823, 0.74880388])
>>>
#Simple python programme to understand random.seed() importance
import random
random.seed(10)
for i in range(5):
print(random.randint(1,100))
上記のプログラムを複数回実行してください。
最初の試み:1から100までの範囲の5つのランダム整数を印刷する
2回目の試行:上記の実行で現れたのと同じ5つの乱数を出力します。
3回目の試み:同じ
.....そう
説明:上記のプログラムを実行するたびに、seedを10に設定します。その後、random generatorはこれを参照変数として使用します。次に、事前定義された式を実行することによって乱数を生成します。
したがって、次回の実行でseedを10に設定すると、参照番号は10に設定され、再び同じ動作が開始されます。
種子の値をリセットするとすぐにそれは同じ植物になります。
注:シード値を変更してプログラムを実行すると、前のシーケンスとは異なるランダムシーケンスが表示されます。
この場合、randomは実際には擬似乱数です。種が与えられると、それは等しい分布で数を生成します。しかし同じシードでは、毎回同じ数列を生成します。変更したい場合は、シードを変更する必要があります。多くの人々は現在の時間か何かに基づいて種を生成するのが好きです。
Imho、それはあなたが再びrandom.seed(samedigit)
を使うとき、同じランダムなコース結果を生成するのに使われます。
In [47]: random.randint(7,10)
Out[47]: 9
In [48]: random.randint(7,10)
Out[48]: 9
In [49]: random.randint(7,10)
Out[49]: 7
In [50]: random.randint(7,10)
Out[50]: 10
In [51]: random.seed(5)
In [52]: random.randint(7,10)
Out[52]: 9
In [53]: random.seed(5)
In [54]: random.randint(7,10)
Out[54]: 9
乱数のセットを生成する前にseed(x)
を設定し、同じ乱数のセットを生成するために同じシードを使用してください。問題を再現する場合に役立ちます。
>>> from random import *
>>> seed(20)
>>> randint(1,100)
93
>>> randint(1,100)
88
>>> randint(1,100)
99
>>> seed(20)
>>> randint(1,100)
93
>>> randint(1,100)
88
>>> randint(1,100)
99
>>>
これはseed()
メソッドに同じ引数を与えても同じ擬似乱数の結果になることを示す小さなテストです。
# testing random.seed()
import random
def equalityCheck(l):
state=None
x=l[0]
for i in l:
if i!=x:
state=False
break
else:
state=True
return state
l=[]
for i in range(1000):
random.seed(10)
l.append(random.random())
print "All elements in l are equal?",equalityCheck(l)
これが私の理解です。シード値を設定するたびに、「ラベル」または「参照」が生成されます。次のrandom.function呼び出しはこの「ラベル」にアタッチされているので、次回同じシード値とrandom.functionを呼び出すと、同じ結果が得られます。
np.random.seed( 3 )
print(np.random.randn()) # output: 1.7886284734303186
np.random.seed( 3 )
print(np.random.Rand()) # different function. output: 0.5507979025745755
np.random.seed( 5 )
print(np.random.Rand()) # different seed value. output: 0.22199317108973948