random.seed () : 무엇을합니까?


177

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

이것에 대한 좋은 문서를 찾을 수 없었습니다.


30
난수 생성은 실제로 "무작위"가 아닙니다. 결정적이며 생성하는 시퀀스는 전달하는 시드 값에 따라 결정됩니다 random.seed. 일반적으로을 호출 random.seed()하면 현재 시간이 시드 값으로 사용됩니다. 즉, 스크립트를 실행할 때마다 다른 값 시퀀스를 얻게됩니다.
Asad Saeeduddin

3
동일한 시드를 무작위로 전달한 다음 호출하면 동일한 숫자 세트가 제공됩니다. 이것은 의도 한대로 작동하며, 앱을 시작할 때마다 (예 : / dev / random 또는 time의 출력) 매번 다른 결과를 뿌려야 할 때마다 결과가 달라지게하려면
Tymoteusz Paul

5
시드는 첫 번째 난수를 생성하기 위해 RNG에 공급되는 것입니다. 그 후, 그들은 RNG가 자 급식입니다. 이 때문에 동일한 대답이 일관되게 표시되지 않습니다. 이 스크립트를 다시 실행하면 동일한 "임의"숫자 시퀀스가 ​​표시됩니다. 생성 된 모든 "임의"숫자는 항상 동일하므로 결과를 재현하려는 경우 시드를 설정하면 도움이됩니다.
깜박임

언급할만한 가치가 있습니다.이 게시물에 표시된 시퀀스는 Python 2에 있습니다. Python 3은 다른 시퀀스를 제공합니다.
ggorlen

1
@Blink의 "무작위 번호"사용은 잘못된 것입니다. RNG에는 자체 공급되는 내부 상태가 있습니다. 이 내부 상태에서 randint (1,10) 및 기타 호출에 대한 출력이 파생됩니다. RNG가 randint (1,10)의 출력에서 ​​공급되는 경우 시퀀스는 최대 10 개의 시퀀스 중 1 개로 축소되고 시퀀스는 최대 10 개의 숫자 후에 반복됩니다.
Joachim Wagner

답변:


213

의사 난수 생성기는 값에 대해 일부 작업을 수행하여 작동합니다. 일반적으로이 값은 생성기에 의해 생성 된 이전 숫자입니다. 그러나 생성기를 처음 사용할 때는 이전 값이 없습니다.

의사 난수 생성기를 시드하면 첫 번째 "이전"값이 제공됩니다. 각 시드 값은 주어진 난수 생성기에 대해 생성 된 일련의 값에 해당합니다. 즉, 동일한 시드를 두 번 제공하면 동일한 숫자의 시퀀스가 ​​두 번 나타납니다.

일반적으로 난수 생성기를 프로그램의 각 실행을 변경하는 값으로 시드하려고합니다. 예를 들어, 현재 시간은 자주 사용되는 시드입니다. 이것이 자동으로 발생하지 않는 이유는 원하는 경우 알려진 시드 시퀀스를 얻기 위해 특정 시드를 제공 할 수 있기 때문입니다.


39
때로는 프로그램을 실행할 때마다 동일한 무작위 시퀀스가 ​​생성되도록 시드를 제공하고 싶을 수도 있습니다. 때때로, 프로그램 동작을 결정 론적으로 유지하고 문제 / 버그를 재현 할 수있는 가능성을 유지하기 위해 소프트웨어 프로그램의 임의성을 피할 수 있습니다.
ViFI

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 ()')에 값을 제공한다고 가정합니다. 난수의 필수 속성 중 하나는 재현 할 수 있어야한다는 것입니다. 동일한 시드를 넣으면 동일한 패턴의 난수를 얻습니다. 이렇게하면 처음부터 바로 생성 할 수 있습니다. 다른 시드를 제공합니다. 다른 시드 (3 개 이상)로 시작합니다.

시드가 주어지면 차례로 1에서 10 사이의 난수를 생성합니다. 따라서 하나의 시드 값에 대해 하나의 숫자 세트를 가정합니다.


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-100 범위에서 5 개의 임의의 정수를 인쇄합니다

두 번째 시도 : 위의 실행에서 동일한 5 개의 난수를 인쇄합니다.

세 번째 시도 : 동일

.....곧

설명 : 위 프로그램을 실행할 때마다 seed를 10으로 설정하면 랜덤 제너레이터가이를 참조 변수로 사용합니다. 그런 다음 미리 정의 된 수식을 사용하여 난수를 생성합니다.

따라서 다음 실행에서 시드를 10으로 설정하면 참조 번호가 10으로 다시 설정되고 동일한 동작이 다시 시작됩니다.

시드 값을 재설정하자마자 동일한 플랜트를 제공합니다.

참고 : 시드 값을 변경하고 프로그램을 실행하면 이전과 다른 임의 순서가 표시됩니다.


7

이 경우 무작위는 실제로 의사 난수입니다. 시드가 주어지면 동일한 분포로 숫자를 생성합니다. 그러나 동일한 시드를 사용하면 매번 동일한 번호 시퀀스가 ​​생성됩니다. 그것을 바꾸고 싶다면 씨앗을 바꿔야합니다. 많은 사람들이 현재 시간 또는 무언가를 기반으로 씨앗을 생성하는 것을 좋아합니다.


6

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

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 호출은이 "라벨"에 첨부되므로 다음에 동일한 seed 값과 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)파이썬에서는 의사 난수 생성기 (PRNG) 를 초기화하는 데 사용됩니다 .

PRNG는 난수의 속성과 유사한 숫자 시퀀스를 생성하는 알고리즘입니다. 이 난수는 시드 값을 사용하여 재현 할 수 있습니다 . 따라서 시드 값을 제공하면 PRNG는 시드를 사용하여 임의의 시작 상태에서 시작합니다.

인수 a 는 시드 값입니다. 값이 None인 경우 기본적으로 현재 시스템 시간이 사용됩니다.

version정수에 매개 변수를 변환하는 방법을 지정하는 정수입니다. 기본값은 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.