我如何解释死硬派大正义的结果
How do I interpret the results from dieharder for great justice
这是一个关于SO问题的问题;我不认为它属于 meta,尽管根据定义是 sp,但如果有人认为它应该用于数学、交叉验证等,请告诉我。
背景:
@ForceBru 问这个 关于如何使用 运行d() 生成 64 位 运行dom 数字。 @nwellnhof 提供了一个被接受的答案,它基本上采用 5 运行dom 数字的低 15 位(因为 MAXRAND 显然只是 gua运行teed 至少在某些编译器上是 15 位)并将它们粘合在一起然后丢弃前 11 位 (15*5-64=11)。 @NikBougalis 发表评论说,虽然这看起来很合理,但它不会通过 运行domnes 的许多统计测试。 @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;
}
为了比较,我还 运行 它当时仅针对 运行d() 和 运行d() 的 8 位。
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 之一的弱点。
仅使用 运行d() 在许多测试中都严重失败,大概是因为我采用了一个具有 15 位 运行domness 的数字并将其作为 32 位 运行统治。
一次使用 运行d() 的低 8 位对于带有 ntuple 2 的 rgb_lagged_sum 来说是弱的,并且(编辑)失败 dab_monobit,带有元组12
我的问题是:
- 我是否正确地解释了 8 位 运行domly 的结果,即考虑到其中一项测试(标记为 "good";为了记录,它也返回为对于标记为 "suspect" 的顽固分子测试之一来说很弱),结果很弱,一个失败了,应该怀疑 运行d() 的 运行domness。
- 我是否正确解释了被测算法的结果(即这也应该被轻微怀疑)
- 根据对弱测试的描述(例如 sts_serial 查看特定大小的位模式分布是否有效),我是否应该能够确定偏见可能是
- 如果是 3,因为我不是,有人可以指出我应该看到什么吗?
编辑:理解 运行d() 并不一定运行很棒。此外,我试图思考哪些值不太可能出现,并且推测零、最大值或重复数字可能是……但是对 1000000000 次尝试进行测试,该比率非常接近每 2^1 的预期值15 次(例如,在 1000000000 次运行中,我们看到 30512 个零、30444 个最大值和 30301 个重复,并且 bc 表示 30512 * 2^15 是 999817216;其他运行具有类似的比率,包括最大 and/or 重复更大的情况比零。
当您 运行 更顽固时,您真正需要关注的列是 p 值列。
p 值列本质上说:"This is the probability that real random numbers could have produced this result." 您希望它在 0 和 1 之间均匀分布。
您还需要 运行 对可疑案件进行多次检查。例如,如果你有一个 p 值为(例如).03 的列,那么如果你重新 运行 它,你仍然有 .03(而不是一些更高的值)那么你可以有一个高确信您的随机数生成器在该测试中表现不佳,而不仅仅是 3% 的侥幸。然而,如果你得到一个高值,那么你可能正在寻找统计上的侥幸。但它是双向的。
最终,了解关于随机或伪随机过程的事实是困难的。但是有了顽固分子,你对很多事情都有大概的了解。
这是一个关于SO问题的问题;我不认为它属于 meta,尽管根据定义是 sp,但如果有人认为它应该用于数学、交叉验证等,请告诉我。
背景:
@ForceBru 问这个
所以,我运行更顽固。我运行它反对有问题的算法
unsigned long long llrand() {
unsigned long long r = 0;
for (int i = 0; i < 5; ++i) {
r = (r << 15) | (rand() & 0x7FFF);
}
return r & 0xFFFFFFFFFFFFFFFFULL;
}
为了比较,我还 运行 它当时仅针对 运行d() 和 运行d() 的 8 位。
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 之一的弱点。
仅使用 运行d() 在许多测试中都严重失败,大概是因为我采用了一个具有 15 位 运行domness 的数字并将其作为 32 位 运行统治。
一次使用 运行d() 的低 8 位对于带有 ntuple 2 的 rgb_lagged_sum 来说是弱的,并且(编辑)失败 dab_monobit,带有元组12
我的问题是:
- 我是否正确地解释了 8 位 运行domly 的结果,即考虑到其中一项测试(标记为 "good";为了记录,它也返回为对于标记为 "suspect" 的顽固分子测试之一来说很弱),结果很弱,一个失败了,应该怀疑 运行d() 的 运行domness。
- 我是否正确解释了被测算法的结果(即这也应该被轻微怀疑)
- 根据对弱测试的描述(例如 sts_serial 查看特定大小的位模式分布是否有效),我是否应该能够确定偏见可能是
- 如果是 3,因为我不是,有人可以指出我应该看到什么吗?
编辑:理解 运行d() 并不一定运行很棒。此外,我试图思考哪些值不太可能出现,并且推测零、最大值或重复数字可能是……但是对 1000000000 次尝试进行测试,该比率非常接近每 2^1 的预期值15 次(例如,在 1000000000 次运行中,我们看到 30512 个零、30444 个最大值和 30301 个重复,并且 bc 表示 30512 * 2^15 是 999817216;其他运行具有类似的比率,包括最大 and/or 重复更大的情况比零。
当您 运行 更顽固时,您真正需要关注的列是 p 值列。
p 值列本质上说:"This is the probability that real random numbers could have produced this result." 您希望它在 0 和 1 之间均匀分布。
您还需要 运行 对可疑案件进行多次检查。例如,如果你有一个 p 值为(例如).03 的列,那么如果你重新 运行 它,你仍然有 .03(而不是一些更高的值)那么你可以有一个高确信您的随机数生成器在该测试中表现不佳,而不仅仅是 3% 的侥幸。然而,如果你得到一个高值,那么你可能正在寻找统计上的侥幸。但它是双向的。
最终,了解关于随机或伪随机过程的事实是困难的。但是有了顽固分子,你对很多事情都有大概的了解。