이미 많은 정확한 관찰을했습니다!
두 임의 생성기를 모두 시드하지 않으려면 장기적으로 하나 또는 다른 생성기를 선택하는 것이 더 간단 할 것입니다. 하지만 둘 다 사용해야한다면 서로 독립적으로 난수를 생성하기 때문에 둘 다 시드해야합니다.
의 경우 numpy.random.seed()
가장 큰 어려움은 스레드로부터 안전하지 않다는 것입니다. 즉, 두 개의 다른 스레드가 동시에 함수를 실행하는 경우 작동이 보장되지 않기 때문에 실행 스레드 가 여러 개 있는 경우 사용하는 것이 안전 하지 않습니다. 쓰레드를 사용하지 않고 앞으로 이런 식으로 프로그램을 다시 작성할 필요가 없다고 합리적으로 기대할 수 있다면 numpy.random.seed()
괜찮을 것입니다. 나중에 스레드가 필요할 수 있다고 의심 할 이유가있는 경우 제안 된대로 수행 하고 numpy.random.Random
클래스 의 로컬 인스턴스 를 만드는 것이 장기적으로 훨씬 안전 합니다 . 내가 말할 수있는 한 random.random.seed()
스레드로부터 안전합니다 (또는 적어도 반대의 증거를 찾지 못했습니다).
numpy.random
라이브러리는 일반적으로 과학 연구에 사용되는 몇 가지 추가 확률 분포뿐만 아니라 임의의 데이터의 배열을 생성하는 편리한 기능 몇 가지가 포함되어 있습니다. random.random
라이브러리는 좀 더 가볍고, 당신은 과학적 연구 또는 통계 작업을 다른 종류의 일을하지 않는 경우 잘해야한다.
그렇지 않으면 둘 다 Mersenne 트위스터 시퀀스 를 사용하여 난수를 생성하고 둘 다 완전히 결정적입니다. 즉, 몇 가지 핵심 정보를 알고 있다면 다음에 올 숫자 를 절대적으로 확실하게 예측할 수 있습니다. 이러한 이유로 numpy.random도 random.random도 심각한 암호화 용도에 적합하지 않습니다 . 그러나 시퀀스가 매우 길기 때문에 데이터를 리버스 엔지니어링하려는 사람들에 대해 걱정하지 않는 경우 난수를 생성하는 데 둘 다 좋습니다. 이것은 또한 임의의 값을 시드해야하는 이유이기도합니다. 매번 같은 위치에서 시작하면 항상 같은 순서의 난수를 얻게됩니다!
참고로, 암호화 수준의 임의성 이 필요하다면 secrets 모듈을 사용 하거나 Python 3.6 이전의 Python 버전을 사용하는 경우 Crypto.Random 과 같은 것을 사용해야 합니다.
random.random
. 하지만 일반적으로 필요하지 않습니다.