2010-04-01 5 views
4

"모든 개발자는 알아야 할"wiki 페이지를 함께 구성합니다.난수의 하위 비트가 보통 임의의 숫자가 아닌 이유를 설명하는 명확하고 간결한 웹 페이지를 찾으십시오.

나는 rand() % N에 관한 많은 토론을 보았지만 그것을 모두 설명하는 하나의 웹 페이지는 아니었다.

예를 들어이 문제가 C 및 Linux에만 해당되는지 또는 Windows, C++에도 적용되는지 궁금합니다. Java, .Net, Python, Perl.

저 밑으로 가도록 도와주세요. 또한 숫자가 무작위가 아닌 방법은 무엇입니까? 고맙습니다!

답변

2

내가 참조 할 웹 페이지가 없지만 도움이 될만한 "봉투 뒷면"설명이있을 수 있습니다. 간단한 난수 발생기가 작동하는 방식은 단계

  1. 사용을 n 마지막으로 생성 된 번호 또는 시드 번호를 다음과 같은 것입니다.
  2. 곱하기 특별 많은 수의
  3. 에 의해 그 수는 제 3 특별 많은 수

이제 경우 나머지

  • 반환 결과를 던져 또 다른 특별한 다수에게
  • 나누기 추가 4 단계에서 일어나는 일에 대해 생각해보십시오. 단 4 단계에서는 하위 비트 만 결과의 하위 비트를 변경할 수있는 작업을 수행하고 있습니다. 1001과 100 ... 00001을 추가하는 것은 ... 02에서 끝날 것입니다 (하하, 내가베이스 2를 말하고 있었지만 실제로는이 숫자가 낄낄 거 리기 12입니다.) 계산의 최고점에 상관없이. 마찬가지로, 곱하면 1에서 상관없이 끝납니다.

    상단에도 비슷한 문제가 있습니다. 수십억 번은 항상 수백 개의 시들어가는 곳의 기여를 지배 할 것입니다. 이것은 중간이 좋은 물건이 일어나는 곳이라는 사실을 지적합니다. 높은 비트, 중간 비트, 낮은 비트가 여기에서 상호 작용합니다.

    이것은 나누기 단계의 목적으로, 많은 상호 작용이 없었던 결과의 맨 아래 부분을 잘라냅니다. 승수가 더 이상 기계 단어에 맞지 않을 때 컴퓨터가 상위 비트를 삭제하기 때문에 상위 덩어리는 일반적으로 잘리지 않습니다.

    결국 차단 지점은 다소 임의적이며 알고리즘을 설계 한 사람들보다 더 까다 롭고 더 많은 비트를 잘라낼 수 있습니다.

    그들이 얼마나 나쁠 수 있는지에 대한 질문은 실제로 나쁠 수 있습니다. 이를 확인하는 가장 쉬운 방법은 개별 숫자를 튜플에 그룹화하고 그래프로 그려 보는 것입니다. 따라서 임의 숫자가 a, b, c, d, ... 인 경우 그래프 (a,b), (c,d), ...을보고 결과를 확인하십시오. 이것은 스펙트럼 테스트라고 불리며 Rand는 아름답게 실패합니다. 이 링크에 대한 시도가 있습니다 http://random.mat.sbg.ac.at/results/karl/spectraltest/

  • 2

    아마도 대부분의 내장 난수 생성기에 사용되는 알고리즘 인 http://en.wikipedia.org/wiki/Linear_congruential_generator을 확인하십시오.

    아래쪽으로 스크롤하면 "LCG의 추가 문제는 생성 된 시퀀스의 하위 비트가 훨씬 더 짧은 기간을 가짐"이라는 문구를 찾습니다. 일부 통찰력으로는 rand() % N입니다.

    관련 문제