出于编程课程的目的,我试图说明标准 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;
}
但是当我绘制生成的散点图时,我得到的是:
我会期待一些显示更多结构的东西,比如在 Wikipedia 上找到的东西。我在这里做错了吗?我应该绘制更多维度吗?
更新
按照 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
换句话说,这些点位于几乎但不完全垂直的线上。