sourcecode

란드()는 때때로 같은 것을 연속적으로 반환합니까?

codebag 2023. 10. 30. 20:56
반응형

란드()는 때때로 같은 것을 연속적으로 반환합니까?

싱글 스레드 프로그램이 두 번 연속 호출할 때 같은 반환 값을 얻을 수 있는지 궁금합니다.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 = 32187Visual 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++ 컴파일러와 마찬가지로 선형 합동 생성기를 사용했습니다.

선형 합동 생성기

선형 합동 생성기는 반복 방법을 사용합니다.

use the

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

반응형