2011-08-18 1 views
4

에 다른 출력을 얻는다, 그래서 나는 C++ 랜드 (무효) 및부터 srand (INT) 기능을 사용 :C++ 랜드 및부터 srand 내가 임의의 정수를 생성하고 싶어 다른 컴퓨터

int main(){ 
    srand(1); 
    cout << rand() << endl; 
    return 0; 
} 

확인, 내 요구에 맞는합니다. 내가 그것을 실행할 때마다 나는 같은 결과를 얻는다. 나는 그것을 좋아한다!
하지만 문제가 있습니다. 내 컴퓨터에서 실행했을 때 출력으로 16807을 얻었습니다.

static unsigned long int next = 1; 

int rand(void) // RAND_MAX assumed to be 32767 
{ 
    next = next * 1103515245 + 12345; 
    return (unsigned int)(next/65536) % 32768; 
} 

void srand(unsigned int seed) 
{ 
    next = seed; 
} 

왜 : 내가 다른 컴퓨터에 실행 때, 나는이 유사한 간단한 구현을 내가 그 랜드() 및부터 srand (int)를 알고

1804289383.있어? rand()가 여러 머신에서 다른 구현을 할 수 있습니까? 어떻게해야합니까?

나는 그 기계에서 16807을 얻는 그런 방법으로 다른 기계를 변경하고 싶다.
내 컴퓨터에서 랜드 구현이 마음에 듭니다. 다른 컴퓨터가 내 것과 같은 결과를 얻는 방법을 보여주십시오.

미리 감사드립니다.

+0

16807은 아마도 MacOS의 결과 일 것입니다. 그것은 매우 나쁜 랜덤 생성기입니다. [rand() % 7은 항상 0을 반환합니까?] (http://stackoverflow.com/q/7866754/995714) –

답변

8

예, rand()은 구현이 다릅니다. 그것들이 동일 할 필요는 없습니다.

구현 및 플랫폼간에 일관된 시퀀스가 ​​필요한 경우 the C standard 섹션 7.20.2에서 샘플 구현을 복사 할 수 있습니다. randsrand의 이름을 모두 변경하여 표준 라이브러리의 버전과 충돌하지 않도록하십시오. 유형이 구현 전체에서 동일한 크기 및 범위를 갖도록 코드를 조정해야 할 수도 있습니다 (예 : unsigned int이 아닌 uint32_t부터 <stdint.h>까지).

EDIT : 의견의 새로운 정보를 감안할 때, 요구 사항이 우리가 생각한 것과 다른 것처럼 보입니다. (나는 아직도 그 내용이 100 % 명확하지 않습니다.)

하나의 시스템에서 생성 한 저장된 파일과 일치하는 두 시스템에서 임의의 숫자를 생성하려고하지만 네트워크 문제 (파일이 약 1 기가 바이트)로 인해 다른 시스템으로 전송할 수 없습니다. . (옵션을하지 않는 DVD로 굽기, 또는 분할 2 CD를 굽기?)

제안 된 해결 :

이 (두 시스템 모두에서 일관된 결과를 생성하는 사용자 정의 생성기를 쓰기를하더라도 그들이 이전과 같은 결과는 아닙니다.)이 작업을 완료하면 두 시스템 모두에 새로운 1 기가 바이트 데이터 파일 을 다시 생성합니다.. 기존 파일은 불필요 해지고 엄청난 양의 데이터를 전송할 필요가 없습니다.

+0

"Keith Thompson",이 하나입니까? 내 말은, 우리는 뭔가해야한다는 것입니다. 이것은 무언가입니다. 그러므로 우리는 이것을해야합니다. " 하나? –

+0

예, 저는 The One (즉, The_Other)입니다. –

+0

+1 '샘플 구현을 복사 할 수 있습니다.' –

0

두 플랫폼의 int/unsigned int가 다른 크기이기 때문에 생각합니다. ints/unsigned ints는 컴파일중인 두 컴퓨터/OS의 바이트 수와 같습니까? 어떤 플랫폼/컴파일러를 사용하고 있습니까?

동일한 rand/srand 구현을 가정하면 동일한 결과를 얻으려면 동일한 정밀도 (또는 적절한 캐스팅)의 데이터 유형을 사용해야합니다. 플랫폼에 stdint.h가 있으면이를 사용하십시오 (uint32_t와 같이 명시적인 크기를 정의 할 수 있도록).

1

C 및 C++ 사양은 rand 또는 srand에 대한 특정 구현을 정의하지 않습니다. 어느 정도 무작위적인 경우라면 아무 것도 될 수 있습니다. 서로 다른 표준 라이브러리에서 일관된 출력을 기대할 수는 없습니다.

+0

정확합니다. 표준은 주어진 시작 시드에 대해 일관된 시퀀스를 지정하지만 그 보증은 구현간에 적용되지 않습니다. 이 표준은'srand()'와'rand()'의 샘플 구현을 보여 주지만 그것을 사용할 필요는 없다. –

+0

네, 맞습니다. 하지만 어떻게해야합니까? 내 컴퓨터에서 표준 rand와 같은 결과를 얻도록 수동으로 rand 함수를 구현하려고합니다. 내 컴퓨터에서 랜드 구현을 어떻게 볼 수 있습니까? 어디 있니?! 못 찾겠 어. –

+0

'어떻게해야합니까?' –

1

rand 구현이 다를 수 있습니다. 다른 시스템에서 동일한 동작이 필요한 경우이를 제공하는 난수 생성기가 필요합니다. 자신 만의 것을 굴리거나 다른 사람의 것을 사용할 수 있습니다.

C++ 0x 라이브러리의 임의 생성기로 충분하지는 않습니다. 나는 그렇게 생각하지 않는다. 하지만 표준을 읽으면 저의 머리가 회전합니다.

마찬가지로, Boost Random library이 충분한 지 잘 모르겠습니다. 하지만 체크 아웃 할 가치가 있다고 생각합니다. 그리고 거기에 소스 코드가 있으므로 최악의 경우 소스 코드를 기반으로 할 수 있습니다.

건배 & HTH. 또한,

관련 문제