파이썬에서 프로그램 전체에 무작위 시드 설정


82

나는 random다른 파일 에서 모듈의 함수를 사용하는 다소 큰 프로그램을 가지고 있습니다. 프로그램이 항상 동일한 결과를 반환하도록 한 곳에서 임의의 시드를 한 번 설정할 수 있기를 바랍니다. 그것도 얻을 수 있습니까 python?

답변:


116

실행의 주요 파이썬 모듈해야 import random및 전화 random.seed(n)-이 다른 모든 수입간에 공유되는 random씨앗을 다시 설정하지 않는만큼 다른 곳.


3
내가 모르는 사이에 씨앗을 재설정 할 수 있을까? 주 파일에서 한 번 씨앗을 설정하기 때문에, 트릭하지 않습니다
미샤 Obrecht

1
@MischaObrecht 나는 그렇게 생각합니다-시드는 무작위 모듈 의 첫 번째 가져 오기 에서만 초기화됩니다. 두 번 이상 가져 오면 초기화를 수행하지 않고 시드를 재설정하지 않으므로 코드 어딘가에 명시적인 호출이 있어야합니다.
Jon Clements

3
random모듈 수준 코드에서 메서드를 호출하는 경우 main에서 가져 오는 메서드는 in main에 도달하기 전에 random.seed(n)해당 호출이 시드 이전에 이루어 지므로 시간이 시드되고 효과적으로 재현 불가능하게됩니다. 무작위.
Russell Borogove

12
일부 타사 코드가 RNG를 다시 시드하는 것으로 판명되면 (가능성은 낮지 만 가능함) random.Random()생성자 를 통해 독립 상태로 추가 난수 생성기를 생성하고 엄격한 재현성이 중요한 경우이를 사용할 수 있습니다.
Russell Borogove

이것은 나를 위해 작동하지 않습니다. 그리고 재현 가능한 코드가 없습니다. 가져온 모든 라이브러리의 문서를 확인해야 할 것 같네요 ... ( stackoverflow.com/questions/37886997/…
B Furtado

36

zss 의 의견은 실제 답변으로 강조 표시되어야합니다.

사람들이주의해야 할 또 다른 사항 : numpy.random를 사용 numpy.random.seed()하는 경우를 사용 하여 시드를 설정 해야합니다 . 를 사용 random.seed()하면에서 생성 된 난수에 대한 시드가 설정되지 않습니다 numpy.random. 이것은 잠시 나를 혼란스럽게했다. -zss


절대적으로 사실입니다. 응용 프로그램의 어딘가에서에서 난수를 사용하는 random module경우 함수를 말한 random.choices()다음 다른 지점에서 numpy난수 생성기 를 더 내려 가면 np.random.normal()두 모듈에 대한 시드를 설정해야 한다고 가정 해 보겠습니다. 내가 일반적으로하는 일은 내 main.py같은 random.seed(my_seed)np.random.seed(my_seed). 명예는 ZSS합니다
Aenaon

Sage는 PRNG가 Python 및 numpy와 구별되므로 유사한 문제가 있습니다. set_random_seed()세이지에 사용 합니다.
Brent Baccala

8

응용 프로그램 호출 random.seed(x)을 시작할 때 x가 항상 동일한 지 확인하십시오. 이렇게하면 응용 프로그램을 실행할 때마다 의사 난수 시퀀스가 ​​동일 해집니다.


3

Jon Clements는 내 질문에 거의 대답합니다. 그러나 실제 문제는 아니 었습니다. 내 코드의 임의성의 이유는 numpy.linalg SVD였습니다. 왜냐하면 조건이 나쁜 행렬에 대해 항상 동일한 결과를 생성하지는 않기 때문입니다!

따라서 동일한 문제가 발생하면 코드에서 확인하십시오!


22
사람들이주의해야 할 또 다른 사항 : numpy.random을 사용하는 경우 numpy.random.seed ()를 사용하여 시드를 설정해야합니다. random.seed ()를 사용하면 numpy.random에서 생성 된 난수에 대한 시드가 설정되지 않습니다. 이것은 잠시 나를 혼란스럽게했다.
zss 2014

1

이전 답변을 기반으로 구축 : 모든 시드가 제어되는 경우에도 많은 구성이 실행 경로를 다양화할 수 있다는 점에 유의하십시오.

나는 " 내 시드를 항상 동일하게 설정하고 변경 / 외부 종속성이 없으므로 내 코드의 실행 경로가 항상 동일해야합니다. "라고 생각했지만 그것은 틀 렸습니다.

나를 물은 예 list(set(...))는 결과 순서가 다를 수 있습니다.


좋은 지적, 이것은 전에 나를 태 웠습니다. 또한 db에서 결과를 얻는 것과 같은 것들은 달리 지정하지 않는 한 순서대로 (무작위로) 반환합니다
Justin Furuness

-14

자신의 난수 생성기를 사용하면이를 매우 쉽게 보장 할 수 있습니다.

세 개의 큰 소수 (암호화 응용 프로그램이 아니라고 가정)를 선택하고 a, b 및 c에 연결하십시오. a = ((a * b) % c) 이것은 매우 임의의 데이터를 생성하는 피드백 시스템을 제공합니다. 모든 소수가 똑같이 잘 작동하는 것은 아니지만 시뮬레이션을 수행하는 경우에는 문제가되지 않습니다. 대부분의 시뮬레이션에 실제로 필요한 것은 패턴 (의사 난수, 기억)이 충분히 복잡한 숫자의 뒤죽박죽입니다. 어떤 식 으로든 귀하의 애플리케이션과 일치하지 않습니다.

Knuth는 이것에 대해 이야기합니다.


10
Python은 표준 라이브러리에 우수한 난수 기능을 가지고 있기 때문에 직접 롤링하는 것은 불필요하며, 수행중인 작업을 모르는 경우 정말 나쁜 생성기를 만드는 것은 매우 쉽습니다.
Russell Borogove

6
나는 그것이 매우 나쁜 해결책이라는 데 동의합니다. 일반적으로 수백만 개의 샘플을 수집하는 Monte Carlo 시뮬레이션 (내 프로그램)에서 상관 된 난수 (나쁜 생성기의 형태소 분석)는 결과를 쉽게 엉망으로 만들 수 있습니다!
Mischa Obrecht 2012

Knuth가 항상 이것에 대해 이야기하고 있다는 말입니까? 지금도?
수단 - 투 - 의미
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.