Для класса программирования я пытаюсь проиллюстрировать слабые места генераторов случайных чисел, которые обычно поставляются со стандартной библиотекой C, в частности "плохой случайный генератор" rand()
, который поставляется с OSX (quoth manpage).
Я написал простую программу для проверки моего понимания спектрального теста:
#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;
}
Но когда я рисую полученную диаграмму рассеяния, вот что я получаю:
Я бы ожидал, что что-то покажет больше структуры, как то, что можно найти в Википедии. Я здесь что-то не так? Должен ли я рисовать в больших размерах?
UPDATE
Следуя предложению pjs, я увеличил часть участка, где числа меньше 1e7, и вот что я нашел:
Я нахожу точно такие же строки, показанные 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
Другими словами, точки лежат в прямых, но не совсем вертикальных.