rand()
함수는 주어진 시드를 기반으로 의사 난수를 생성하고 주어진 플랫폼에서 항상 동일한 시드로부터 같은 수의 시퀀스를 생성한다는 것을 알고 있습니다. 내가 알고 싶은 것은 그것이주는 이유입니다 동일한 라이브러리를 사용하는 여러 플랫폼에서 다른 시퀀스가 있습니까? 나는. rand()
은 어떻게 구현됩니까?C++ stdlib rand() 함수가 플랫폼간에 동일한 시드에 대해 다른 값을 제공하는 이유는 무엇입니까?
답변
C++ 표준은 rand() 함수에 어떤 알고리즘이 사용되는지 지정하지 않습니다.
이 기능은 시스템에 표준 라이브러리를 작성한 사람 (Visual Studio에 포함 된 표준 라이브러리는 Microsoft, GCC는 표준 라이브러리 용 GNU 사용자)이 정의합니다.
컴파일러는 라이브러리를 가져 오는 위치를 선택하므로 같은 시스템에있는 다른 컴파일러에 대한 표준 라이브러리의 버전이 다를 수 있습니다. 요점은 동일하게 유지됩니다. 사양은 사용 가능한 기능과 수행하는 기능을 보장합니다. 그들이 어떻게하는지.
Windows에서 GNU 컴파일러를 실행하면 동일한 시퀀스가 발생한다는 것을 의미합니까? –
@OmarKooheji 실제로 Windows에 GCC를 설치하려 한 적이 없습니다. 나는 GCC가 설치되었을 때 표준 라이브러리 (아마도 사전 컴파일 된)의 자체 복사본을 가지고 있다고 믿는다. 확실한 것은 모르겠습니다. 설치 한 Windows PC에 액세스 할 수있는 사람이 내 답변을 자유롭게 업데이트해야합니다. – KidneyChris
@OmarKooheji 나는 호기심이 많아 조사를했다. 내 대답을 좀 더 정확하도록 업데이트했습니다. (나중에 주석 스레드를 따르려는 사람들을 위해 : 원래 개발자 환경이 아닌 OS에 라이브러리를 기인했습니다) – KidneyChris
랜드() 함수는 적어도 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++ 상호 운용성에 의존하지 않습니다.
'rand' 또한 C++의 일부입니다. 표준 라이브러리의 일부는 C 표준으로 정의되지만 –
@phresnel, 사실, C++의 일부가 아니기 때문에 그것이 나왔습니다. 나는 내 뜻을 반영하기 위해 나의 대답을 편집했다. – daramarak
- 1. 사용자 정의 rand() 함수가 동일한 값을 반환합니다.
- 2. AES 함수가 다른 값을 반환하는 이유는 무엇입니까?
- 3. PHP에서 MT 구현의 동일한 시드에 대해 서로 다른 출력이 있습니다.
- 4. C++ 11 표준은 구현 전체에서 동일한 시드에 대해 동일한 난수를 보장합니까?
- 5. C : 함수가 0 값을 반환하는 이유는 무엇입니까?
- 6. scikit-image의 local_binary_pattern 함수가 다른 패턴에 대해 동일한 값을 제공하는 이유
- 7. mikroc에는 rand() 함수가 있습니까?
- 8. BFS가 동일한 그래프에서 서로 다른 노드 위치에 대해 다른 실행 시간을 제공하는 이유는 무엇입니까?
- 9. 한 ceil 함수가 다른 답변을 제공하는 이유는 무엇입니까?
- 10. Matlab rand and C++ rand()
- 11. C# 서로 다른 임의 함수가 동일한 값을 생성합니다.
- 12. rand() 함수가 C++에서 제대로 작동하지 않습니다.
- 13. console.log와 document.write가 동일한 코드에 대해 다른 출력을주는 이유는 무엇입니까? 다음
- 14. SHA-1 함수가 C#의 두 파일에 대해 동일한 출력을 표시하는 이유는 무엇입니까?
- 15. 왜이 쿼리 업데이트 dbo.product set price = rand();
- 16. rand()가 항상 같은 값을 반환하는 이유는 무엇입니까?
- 17. seed() -> 동일한 번호가없는 rand()의 첫 번째 호출?
- 18. 은 다른 호스트 플랫폼간에 동일한 vbox 가상 머신을 공유합니까?
- 19. 다른 파일에 대해 다른 EOL을받는 이유는 무엇입니까?
- 20. 플랫폼간에 SQLite 암호화가 다릅니다.
- 21. 다른 문자열에 대해 동일한 해시 값을 얻는 C openssl
- 22. C++ MurmurHash3가 다른 키에 대해 동일한 값을 반환하는 중
- 23. 빈 값을 제공하는 PHP rand 함수 - 여전히 작동하지 않습니다.
- 24. C#에서 파일을 플랫폼간에 복사하는 방법은 무엇입니까?
- 25. sizeof가 C에서 같은 문자열에 대해 다른 값을 반환하는 이유는 무엇입니까?
- 26. 함수가 잘못된 값을 출력하는 이유는 무엇입니까?
- 27. VS2008 빌드가 동일한 솔루션에 대해 msbuild와 다른 이유는 무엇입니까?
- 28. MD5가 동일한 입력에 대해 다른 값을 반환합니다.
- 29. rand() % 20 + 10이 십대를 C++로 계속 돌려주는 이유는 무엇입니까?
- 30. 내 C++ clock() 기반 함수가 음수 값을 반환하는 이유는 무엇입니까?
'rand '의 지정이 sequence에 의해 생성 된 값을 지시하지 않기 때문에. [] (http : //en.cppreference.co.kr/w/cpp/numeric/random)을 입력하십시오. –
표준은 시퀀스 또는 의사 난수 시퀀스의 생성 방법을 지정하지 않습니다. 따라서이 두 가지 측면에 관한 플랫폼 전반의 구현 또는 동작에 대한 제한이 없습니다. C++ 11은 [더 많은 사양을 가진 난수 생성기] (http://en.cppreference.com/w/cpp/numeric/random)를 추가합니다. – juanchopanza
알았어, 표준을 확인한 결과, 시퀀스와 관련하여 아무 것도 지정되어 있지 않다는 것을 알았는데, 구현에 어떤 요인이 달려 있는가? 그것은 운영 체제에 남아 있습니까? – Einherji