프로그래밍 클래스의 목적을 위해 보통 표준 C 라이브러리와 함께 제공되는 난수 생성기의 약점, 구체적으로 OSX (quoth the manpage)와 함께 제공되는 "잘못된 임의 생성기"rand()
을 설명하려고합니다. OSX의 rand()가 스펙트럼 테스트에 실패하게하려면 어떻게해야합니까?
#include <stdio.h>
#include <stdlib.h>
int main() {
int i;
int prev = rand();
int new;
for (i=0; i<100000; i++) {
new = rand();
printf("%d %d\n", prev, new);
prev = new;
}
return 0;
}
을하지만 결과 산점도를 그릴 때, 여기에 내가 무엇을 얻을 수 있습니다 :
나는 것 사람이 찾은 것과 같은 더 많은 구조를 보여줄 것으로 기대했습니다. on Wikipedia. 내가 여기서 뭔가 잘못하고있는거야? 더 많은 차원에서 플롯해야합니까? 나는 숫자가 여기 1E7보다 작은, 그리고 플롯의 부분 확대 PJS의 제안에 따라
UPDATE
내가 볼 것입니다 :
나는 정확히 찾아 같은 줄이 pjs에 의해 보여 주었다. 그것들은 수직 인 것처럼 보이지만, 어떤 값들이 "놓친"것을 암시하기 때문에 불가능합니다. rand()
. 내가 데이터를 sort -n
때 내가 무엇을보고 (샘플)입니다 :
571 9596797
572 9613604
575 9664025
578 9714446
580 9748060
581 9764867
584 9815288
586 9848902
587 9865709
590 9916130
592 9949744
127774 13971
127775 30778
127780 114813
127781 131620
127782 148427
127783 165234
127785 198848
127787 232462
127788 249269
즉, 포인트 거의이다 라인에 누워 있지만, 매우, 수직 없습니다. 당신은 몇 가지 측면을 가지고 a
및 b
의 방정식을 해결할 수
next = a * prev + b (mod RAND_MAX+1)
: 나쁜 rand
가정
, 그때받은 것 같은 노이즈를 볼 것으로 예상한다. 연결된 페이지에 표시된 것과 같이 구조화 된 출력을 원할 경우 무작위 데이터가 원하는 것일 수 있습니다. – SevenBits
예, 요점은 무작위 데이터가 매우 임의적이지 않다는 것을 입증하려는 시도입니다. 링크 페이지에 표시된 이미지는 수십만 개의 난수를 표시합니다. (저는 궁금합니다. "각 점은 3 개의 연속적인 의사 난수 값을 나타 냅니까?"라는 말은 각 세 숫자가 점의 x, y, z 좌표로 사용된다는 것을 의미합니까? –
3D를 시도해야한다고 생각합니다. –