プログラミングクラスの目的で、標準Cライブラリに通常付属する乱数ジェネレーター、特にrand()
OSXに付属する「悪いランダムジェネレーター」の弱点を説明しようとしています(マンページを引用)。
スペクトル テストの理解度をテストするための簡単なプログラムを作成しました。
#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;
}
しかし、結果の散布図をプロットすると、次のようになります。
ウィキペディアで見つけたもののように、もっと構造を示すものを期待していたでしょう。ここで何か間違ったことをしていますか?より多くの次元でプロットする必要がありますか?
アップデート
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
言い換えれば、点は、完全ではないがほぼ垂直な線上にあります。