2013-02-27 1 views
19

rand() 함수는 주어진 시드를 기반으로 의사 난수를 생성하고 주어진 플랫폼에서 항상 동일한 시드로부터 같은 수의 시퀀스를 생성한다는 것을 알고 있습니다. 내가 알고 싶은 것은 그것이주는 이유입니다 동일한 라이브러리를 사용하는 여러 플랫폼에서 다른 시퀀스가 ​​있습니까? 나는. rand()은 어떻게 구현됩니까?C++ stdlib rand() 함수가 플랫폼간에 동일한 시드에 대해 다른 값을 제공하는 이유는 무엇입니까?

+8

'rand '의 지정이 sequence에 의해 생성 된 값을 지시하지 않기 때문에. [] (http : //en.cppreference.co.kr/w/cpp/numeric/random)을 입력하십시오. –

+3

표준은 시퀀스 또는 의사 난수 시퀀스의 생성 방법을 지정하지 않습니다. 따라서이 두 가지 측면에 관한 플랫폼 전반의 구현 또는 동작에 대한 제한이 없습니다. C++ 11은 [더 많은 사양을 가진 난수 생성기] (http://en.cppreference.com/w/cpp/numeric/random)를 추가합니다. – juanchopanza

+0

알았어, 표준을 확인한 결과, 시퀀스와 관련하여 아무 것도 지정되어 있지 않다는 것을 알았는데, 구현에 어떤 요인이 달려 있는가? 그것은 운영 체제에 남아 있습니까? – Einherji

답변

21

C++ 표준은 rand() 함수에 어떤 알고리즘이 사용되는지 지정하지 않습니다.

이 기능은 시스템에 표준 라이브러리를 작성한 사람 (Visual Studio에 포함 된 표준 라이브러리는 Microsoft, GCC는 표준 라이브러리 용 GNU 사용자)이 정의합니다.

컴파일러는 라이브러리를 가져 오는 위치를 선택하므로 같은 시스템에있는 다른 컴파일러에 대한 표준 라이브러리의 버전이 다를 수 있습니다. 요점은 동일하게 유지됩니다. 사양은 사용 가능한 기능과 수행하는 기능을 보장합니다. 그들이 어떻게하는지.

+0

Windows에서 GNU 컴파일러를 실행하면 동일한 시퀀스가 ​​발생한다는 것을 의미합니까? –

+0

@OmarKooheji 실제로 Windows에 GCC를 설치하려 한 적이 없습니다. 나는 GCC가 설치되었을 때 표준 라이브러리 (아마도 사전 컴파일 된)의 자체 복사본을 가지고 있다고 믿는다. 확실한 것은 모르겠습니다. 설치 한 Windows PC에 액세스 할 수있는 사람이 내 답변을 자유롭게 업데이트해야합니다. – KidneyChris

+1

@OmarKooheji 나는 호기심이 많아 조사를했다. 내 대답을 좀 더 정확하도록 업데이트했습니다. (나중에 주석 스레드를 따르려는 사람들을 위해 : 원래 개발자 환경이 아닌 OS에 라이브러리를 기인했습니다) – KidneyChris

7

랜드() 함수는 적어도 2^32주기 범위 [0, {} RAND_MAX]에 의사 랜덤 정수 의 시퀀스를 계산한다.

rand_r() 함수는 [0, {RAND_MAX}] 범위의 의사 임의 시퀀스 의 정수를 계산해야합니다. rand_r()가 종자가 가리키는 오브젝트에 대한 동일한 초기 값으로 호출되며, 그 객체가 연속 되돌아 간 변형되지 않으면

(의 {RAND_MAX} 매크로의 값은 적어도 32767한다) rand_r()을 호출하면 동일한 순서가 생성됩니다.

srand() 함수는 후속 rand() 호출에 의해 반환 될 의사 시퀀스의 새로운 시퀀스에 대한 시드로 인수를 사용합니다. 동일한 시드 값으로 srand()를 호출하면 시퀀스의 의사 난수가 반복됩니다. 랜드() 만들어진부터 srand하는 호출하기 전에 호출되면부터 srand()이 제 1

의 시드 값 랜드 호출 될 때, 동일한 시퀀스 로서 생성한다() 함수 반환한다 시퀀스의 다음 의사 난수.

이것은 IEEE Std 1003.1 C 표준이 rand() 함수가 어떻게 동작해야하는지에 대해 말한 것입니다. 시퀀스가 어떻게 계산되어야하는지에 대해서는 아무 것도 말하지 않습니다. 즉, 각 구현자는 의사 랜덤 시퀀스 생성자의 자체 버전을 자유롭게 선택할 수 있습니다.

귀하의 관찰에 따르면 그 자유를 활용 한 것으로 나타났습니다.

또한 rand() 더 많거나 인 <cstdlib>의 일부임을 지적 할 수 적은 C 표준 라이브러리의 복사 및 새가있는 경우 더 많은 유연성 및 표준 시퀀스 생성기를 제공합니다 새 라이브러리 충분한 C++ 컴파일러이며 C - C++ 상호 운용성에 의존하지 않습니다.

+0

'rand' 또한 C++의 일부입니다. 표준 라이브러리의 일부는 C 표준으로 정의되지만 –

+0

@phresnel, 사실, C++의 일부가 아니기 때문에 그것이 나왔습니다. 나는 내 뜻을 반영하기 위해 나의 대답을 편집했다. – daramarak

관련 문제