란드()는 때때로 같은 것을 연속적으로 반환합니까?
싱글 스레드 프로그램이 두 번 연속 호출할 때 같은 반환 값을 얻을 수 있는지 궁금합니다.rand()
?
그렇다면, 이 주장이 과연 불붙을 수 있을까요?
assert(rand() != rand());
한 가지 예를 찾을 수 있다면, 질문에 대한 답은 "예"입니다.
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
unsigned int i;
for(i = 0; ; i++) {
int r = rand();
if (r == rand()) {
printf("Oops. rand() = %d; i = %d\n", r, i);
break;
}
}
return 0;
}
인쇄물Oops. rand() = 3482; i = 32187
Visual Studio 2010이 설치된 Windows에서 사용할 수 있습니다.
EDIT: 아래 버전을 사용하여 2개의 연속적인 란드() 호출이 동일한 값을 반환하는 모든 시퀀스를 탐지합니다.C는 rand()가 "0에서 RAND_MAX 범위의 의사 랜덤 정수"를 반환하고 RAND_MAX가 32767 이상이어야 한다고만 지정합니다.PRNG의 품질이나 구현에 제약이 없거나 2회 연속 란드() 호출이 동일한 값을 반환할 수 있는지 여부와 같은 기타 세부 정보는 없습니다.
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
unsigned int i;
int r1 = rand();
int r2 = rand();
for(i = 0; ; i++) {
if (r1 == r2) {
printf("Oops. rand() = %d; i = %d\n", r1, i);
}
r1 = r2;
r2 = rand();
}
return 0;
}
조사를 했습니다.
내 컴파일러()를 발견했습니다.msvc10
)의 랜드 구현은 다른 c/c++ 컴파일러와 마찬가지로 선형 합동 생성기를 사용했습니다.
선형 합동 생성기
선형 합동 생성기는 반복 방법을 사용합니다.
ptd->_holdrand(n)는 ptd->_holdrand(n+1)와 동일하지 않지만 모드 결과는 동일합니다.
msvc 구현
@nos 결과를 보여줍니다.
return( ((ptd->_holdrand = ptd->_holdrand * 214013L + 2531011L) >> 16) & 0x7fff );
ptd->_holdrand = 2375716238;
return 3482; (2375716238 >> 16) % 32768
ptd->_holdrand = 228240921;
return 3482; (228240921 >> 16) % 32768
마지막 답은 랜드 ()는 나의 본능과 같은 가치를 두배로 돌려줄 것이라는 것입니다.
이상임의.rand()
함수는, 만약 두번 호출된다면, 매번 같은 결과를 다음의 확률로 반환할 것입니다.1.0 / RAND_MAX
.
그렇지만rand()
는 진정한 난수 생성기가 아닙니다.일반적으로 선형 합동형인 의사 난수 생성기(PRNG)입니다.
PRNG의 내부 상태는 연속적인 호출에서 반복되어서는 안 되며, 반복된 경우,rand()
영원히 같은 번호에 갇힐 겁니다이것은 미들 스퀘어 방법과 같이 잘못 설계된 알고리즘에서 일어날 수 있습니다.
그러나 일부 PRNG 구현은(일부는 아니지만) 내부 상태가 출력 상태보다 더 많은 비트를 가지고 있습니다.예를들면,java.util.Random
는 48비트 내부 상태를 사용하지만 출력에 가장 중요한 32비트만 포함합니다.이 경우, (적어도 이론적으로는) 동일한 내부 상태를 갖지 않고 두 번 연속적으로 동일한 출력을 얻는 것이 가능합니다.
좋은 난수 생성기는 때때로 같은 값을 연속으로 두 번 반환해야 합니다.양의 정수 0 <= r < 2^31을 반환한다고 하자.연속된 두 숫자가 동일할 확률은 완벽한 난수 생성기의 경우 약 20억 분의 1일 것입니다.1,000억 통화에서 같은 두 개의 연속된 숫자가 나오지 않을 확률은 약 10^15분의 1입니다.
언급URL : https://stackoverflow.com/questions/24011332/will-rand-sometimes-return-the-same-consecutively
'sourcecode' 카테고리의 다른 글
사용 - PowerShell에서 여러 문자열을 걸러내는 것을 좋아하지 않습니다. (0) | 2023.10.30 |
---|---|
페이지를 다시 로드하지 않고 javascript/jQuery를 사용하여 URL 또는 쿼리 문자열을 업데이트하려면 어떻게 해야 합니까? (0) | 2023.10.30 |
Postgre와 동치Oracle 9i의 SQL array() / array_to_string() 함수 (0) | 2023.10.30 |
'SELECT'를 사용하여 함수 호출 (0) | 2023.10.25 |
Android 앱을 프로그래밍적으로 "다시 시작"하려면 어떻게 해야 합니까? (0) | 2023.10.25 |