这是一个关于SO问题的问题;我不认为它属于meta,尽管它是定义的,但如果有人认为它应该进入数学,交叉验证等,请告诉我。
背景: @ForceBru问这个question 有关如何使用rand()生成64位随机数。 @nwellnhof提供了一个被接受的答案,基本上接受了5个随机数的低15位(因为MAXRAND显然只保证在至少一些编译器上是15位)并将它们粘合在一起然后丢弃前11位(15 * 5) -64 = 11)。 @NikBougalis发表评论说,虽然这似乎是合理的,但它不会通过许多随机的统计测试。 @Foon(我)要求引用或测试的例子,它会失败。 @NikBougalis回答了一个没有解释我的答案; @DavidSwartz建议对抗顽固分子。
所以,我跑了蠢货。我针对有问题的算法运行它
unsigned long long llrand() {
unsigned long long r = 0;
for (int i = 0; i < 5; ++i) {
r = (r << 15) | (rand() & 0x7FFF);
}
return r & 0xFFFFFFFFFFFFFFFFULL;
}
为了进行比较,我还在rand()和8bit rand()上运行它。
void rand_test()
{
int x;
srand(1);
while(1)
{
x = rand();
fwrite(&x,sizeof(x),1,stdout);
}
void rand_byte_test()
{
srand(1);
while(1)
{
x = rand();
c = x % 256;
fwrite(&c,sizeof(c),1,stdout);
}
}
有问题的算法回来时有两个测试显示ntuple = 28的rgb_lagged_sum和ntuple = 8的sts_serials之一的弱点。
正好使用rand()在许多测试中失败了,大概是因为我采用了具有15位随机性的数字并将其作为32位随机性传递出去。
一次使用rand()的低8位对于带有ntuple 2的rgb_lagged_sum来说是弱的,而(编辑)失败了dab_monobit,带有tuple 12
我的问题是:
编辑:明白rand()并不能保证很好。此外,我试图考虑哪些值不太可能,并且推测零,最大值或重复数字可能是......但是进行了1000000次尝试的测试,该比率非常接近每2 ^ 1的预期值^ 15次(例如,在1000000次运行中,我们看到30512个零,30444个最大值和30301个重复,并且bc表示30512 * 2 ^ 15是999817216;其他运行具有相似的比率,包括max和/或repeat大于零的情况
答案 0 :(得分:3)
当您运行dieharder时,您真正需要观察的列是p值列。
p值列基本上表示:&#34;这是真实随机数可能产生此结果的概率。&#34;您希望它在0和1之间均匀分布。
您还希望在可疑案件中多次运行它。例如,如果你有一个p值为(例如).03的列,那么如果你重新运行它,你仍然有.03(而不是一些更高的值)那么你可以高度放心随机数字生成器在该测试中表现不佳,而且不仅仅是3%的侥幸。但是,如果你获得了很高的价值,那么你可能正在考虑一个统计上的侥幸。但它会削减两种方式。
最终,了解随机或伪随机过程的事实很困难。但是,有了顽固分子,你就可以了解很多事情。