random.seed():何をしますか?


177

random.seed()Python で何ができるのか少し混乱しています。たとえば、以下の試験はなぜ(一貫して)何をするのですか?

>>> 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

これに関する良いドキュメントが見つかりませんでした。


30
乱数の生成は、真に「ランダム」ではありません。これは確定的であり、生成されるシーケンスは、渡したシード値によって決定されますrandom.seed。通常、を呼び出すだけでrandom.seed()、現在の時刻がシード値として使用されます。つまり、スクリプトを実行するたびに、異なる値のシーケンスが取得されます。
Asad Saeeduddin 2014年

3
同じシードをランダムに渡してから呼び出すと、同じ数のセットが得られます。これは意図したとおりに機能しており、結果を毎回異なるものにしたい場合は、アプリを起動するたびに異なるものをシードする必要があります(たとえば、/ dev / randomまたはtimeからの出力)
Tymoteusz Paul

5
シードは、最初の乱数を生成するためにRNGに供給されるものです。その後、彼らのRNGは自給です。このため、一貫して同じ答えが表示されません。このスクリプトを再度実行すると、同じ一連の「ランダムな」数値が得られます。シードを設定すると、結果を再現する場合に役立ちます。生成されるすべての「ランダムな」数値は常に同じになるためです。
2014年

言及する価値がある:この投稿に示されているシーケンスはPython 2のものです。Python3は別のシーケンスを提供します。
ggorlen

1
@Blinkの「乱数」の使用は誤解を招くものです。RNGには、自己供給される内部状態があります。この内部状態から、randint(1,10)およびその他の呼び出しの出力が導出されます。RNGがrandint(1,10)の出力から供給されている場合、シーケンスは最大で10のシーケンスの1つに折りたたまれ、最大で10の数の後にシーケンスが繰り返されます。
Joachim Wagner

回答:


213

疑似乱数ジェネレーターは、値に対して何らかの操作を実行することによって機能します。通常、この値は、ジェネレーターによって生成された以前の数値です。ただし、ジェネレータを初めて使用するときは、以前の値はありません。

疑似乱数ジェネレータをシードすると、最初の「以前の」値になります。各シード値は、特定の乱数ジェネレーターの一連の生成値に対応します。つまり、同じシードを2回指定すると、同じ数列が2回得られます。

一般に、乱数ジェネレーターに、プログラムの各実行を変更する値をシードする必要があります。たとえば、現在時刻は頻繁に使用されるシードです。これが自動的に行われない理由は、必要に応じて、特定のシードを提供して、既知の数列を取得できるようにするためです。


39
プログラムの実行ごとに同じランダムシーケンスが生成されるようにシードを指定したい場合があることに言及する価値があります。場合によっては、プログラムの動作を確定的に保ち、問題/バグを再現する可能性を保つために、ソフトウェアプログラムのランダム性が回避されます。
ViFI 2017

1
@ViFIの発言に従って、プログラムの動作を確定的に保つ(シードを固定する、またはシードのシーケンスを固定する)ことで、プログラムへの変更が有益かどうかをより適切に評価することもできます。
shaneb

実際のシナリオで説明していただけませんか。同じ使用例を理解できません。他のプログラミング言語でもこれに似たものはありますか?
Shashank Vivek

1
これが実際のシナリオです:stackoverflow.com/questions/5836335/…。ランダムシードは、研究で再現可能な結果を​​作成するためにも一般的です。たとえば、データサイエンティストであり、ランダム性を使用するある種のモデル(ランダムフォレストなど)で結果を公開する場合、公開されたコードにシードを含めて、人々があなたのことを確認できるようにします。計算は再現可能です。
Galen Long

89

他のすべての答えは、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

33
>>> 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セットの数値を想定します。


15

乱数前の値にいくつかの操作によって生成されます。

以前の値がない場合は、現在の時刻が自動的に以前の値になります。この以前の値は、random.seed(x)where を使用して独自に提供できます。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()ます。


11
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])
>>>

11
# Simple Python program to understand random.seed() importance

import random

random.seed(10)

for i in range(5):    
    print(random.randint(1, 100))

上記のプログラムを複数回実行します...

1回目の試行:1から100の範囲で5つのランダムな整数を出力します

2回目の試行:上記の実行で出現したものと同じ5つの乱数を出力します。

3回目の試行:同じ

.....など

説明:上記のプログラムを実行するたびに、シードを10に設定しています。ランダムジェネレーターはこれを参照変数として使用します。そして、事前に定義された式を実行することにより、乱数を生成します。

したがって、次の実行でシードを10に設定すると、参照番号が10に再度設定され、同じ動作が再び開始されます...

シード値をリセットするとすぐに、同じ植物が得られます。

注:シード値を変更してプログラムを実行すると、前のものとは異なるランダムシーケンスが表示されます。


7

この場合、ランダムは実際には疑似ランダムです。シードが与えられると、それは等分布の数値を生成します。ただし、同じシードを使用すると、毎回同じ番号シーケンスが生成されます。変更したい場合は、シードを変更する必要があります。多くの人が現在の時間などに基づいてシードを生成することを好みます。


6

イムホ、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

4

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
>>> 

3

これが私の理解です。シード値を設定するたびに、「ラベル」または「参照」が生成されます。次の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

1

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)

4
同等性チェックの短縮:len(set(l))<=1
Oliver Ni

0

random.seed(a, version)Pythonでは、疑似乱数ジェネレータ(PRNG)を初期化するために使用されます。

PRNGは、乱数のプロパティを近似する一連の数値を生成するアルゴリズムです。これらの乱数は、シード値を使用して再現できます。したがって、シード値を指定すると、PRNGはシードを使用して任意の開始状態から開始します。

引数a はシード値です。aの値がNoneデフォルトでは現在のシステム時刻が使用されます。

and versionは、aパラメータを整数に変換する方法を指定する整数です。デフォルト値は2です。

import random
random.seed(9001)
random.randint(1, 10) #this gives output of 1
# 1

同じ乱数を再現したい場合は、同じシードをもう一度指定してください

random.seed(9001)
random.randint(1, 10) # this will give the same output of 1
# 1

シードを指定しないと、以前のように1ではなく、異なる数が生成されます

random.randint(1, 10) # this gives 7 without providing seed
# 7

以前とは異なるシードを提供する、異なる乱数が得られます

random.seed(9002)
random.randint(1, 10) # this gives you 5 not 1
# 5

したがって、要約すると、同じ乱数を再現したい場合は、シードを指定します。具体的には、同じシード

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.