2009-01-21 4 views
5

시드를 가진 RNG를 사용하는 길고 복잡한 소스 코드가 있습니다.C++. RNG가 동일한 시드를 사용하는 두 개의 다른 시스템에서 다른 임의의 변수를 제공 할 가능성이 있습니까?

이 코드는 시뮬레이터이며이 시뮬레이터의 매개 변수는이 RNG에 의해 주어진 임의의 값입니다. 동일한 컴퓨터에서 코드를 실행할 때 출력을 몇 번이나 시도해도 동일합니다. 그러나 두 개의 다른 컴퓨터에서이 코드를 실행하고 두 컴퓨터의 출력을 비교하면 서로 다릅니다.

두 개의 서로 다른 기계가 동일한 난수 생성기와 동일한 시드를 사용하여 어떻게 든 다른 출력을 낼 수 있습니까?

컴파일러 버전, 라이브러리 및 OS는 동일합니다.

+0

오픈 소스라면 PRNG를 사용하고 싶습니다. 호기심 때문에 소스 코드를보고 싶습니다. :) – falstro

+0

'출력 비교' , 당신은 시뮬레이션 또는 시뮬레이션 결과를 비교하고 있습니까? –

답변

9

RNG가 네트워크 카드 주소와 같은 시드와 컴퓨터 특정 데이터를 결합하여 난수를 생성 할 수 있으므로 확실히 가능합니다. 기본적으로 구현에 따라 다릅니다.

4

시드를 사용하여 숫자 시퀀스를 생성하는 의사 랜덤 생성기의 경우 정의에 따라 서로 다를 수 없습니다. 그러나, 사용하고있는 머신이 seed에 의존하는 기계 또는 아주 간단하게 다른 알고리즘을 사용하고 있다면, 그것은 물론 가능합니다. 어떤 구현을 사용하고 있으며 표준 라이브러리 구현이라면 둘 다 같은 버전입니까?

+0

이 질문에 라이브러리, 컴파일러 및 OS는 동일하다는 의문이 제기됩니다. –

+0

여전히 - 부동 소수점 설정이 다른 Linux/glibc/gcc 일 수 있습니다. – MSalters

+0

발전기에 대해 전혀 알지 못하면 시드 (seeding)시 특정 기계에 액세스 할 수 있습니다. –

0

아마 little/big endian 문제이거나 코드가 어떤 방식 으로든 프로세서를 감지합니다. 가장 쉬운 방법은 중단 점이나 유사한 디버그 루틴을 사용하여 작동중인 시드 루틴과 RNG 자체를 보는 것입니다.

5

다른 결과가 나오므로 다른 결과가 나타날 수 있습니다. 대답하기 쉬운 질문, 다음에!

진지하게 : RNG에 대한 소스 코드를 몰라도 버그 또는 기능을 관찰하고 있는지 여부를 알기가 어렵습니다. 그러나 문제의 RNG가 다른 곳에서 두 번째 시드를 사용하고있는 것 같습니다. 현재 시간 또는 네트워크 카드의 MAC 주소와 같은 하드웨어 종속 값.

+0

현재 시간이 아니기 때문에 기계에서 동일한 결과가 반복해서 발생하지만 MAC 주소는 확실히 가능성이 있습니다. – gkrogers

-1

사용중인 RNG에 크게 달려 있습니다. random(3) 또는 rand48(3) 패밀리는 동일한 시드로 실행될 때 동일한 시퀀스를 반환하도록 설계되었습니다. 이제 사용중인 RNG가 /dev/random 출력을 사용하면 모든 베팅이 꺼지고 결과가 달라집니다.

2

예. 예를 들어 CPU가 IEEE float (ISO C++에서 보증하지 않음)를 제대로 구현하고 있는지 여부에 따라 결과가 달라질 수있는 부동 소수점 RNG가 있습니다. 또한 메모리에 두 배로 80 비트를 쏟는 것과 같은 결과는 결과에 영향을 줄 수 있습니다.

"시드"개념에 대한 혼란이있을 수 있습니다. 어떤 사람들은 시드를 모든 입력으로 정의하여 RNG의 초기 상태를 설정합니다. 다른 것은 그것을 코드의 명시적인 입력으로 만 제한하고, 예를 들어. HW 소스 또는/dev/random.

5

기계에서 기계로 반복 할 수있는 것이 필요한 경우 Boost Random Number Library을 사용해보십시오.

+0

+1 (그게 내가 할 수있는 전부이기 때문에). 일반적으로 시스템 RNG에는 종종 문제가 있으며 더 나은 Boost로 전환하는 것이 종종 좋은 아이디어입니다. –

관련 문제