我如何解读顽固分子的结果以获得极大的正义

时间:2015-03-31 10:41:41

标签: random

这是一个关于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

我的问题是:

  1. 我是否正确地解释了8位的结果,即给出了其中一个测试(标记为&#34;良好&#34 ;;对于记录,它也回归为弱的一个顽固分子测试标记为&#34;怀疑&#34;),弱者和失败者,rand()的随机性应该被怀疑。
  2. 我是否正确地解释了被测算法的结果(也就是说这也应该是勉强怀疑的)
  3. 鉴于对弱回复测试的描述(例如,对于sts_serial查看特定大小的位模式的分布是否有效),我应该能够确定偏差可能是什么
  4. 如果是3,既然我没有,有人可以指出我应该看到的吗?
  5. 编辑:明白rand()并不能保证很好。此外,我试图考虑哪些值不太可能,并且推测零,最大值或重复数字可能是......但是进行了1000000次尝试的测试,该比率非常接近每2 ^ 1的预期值^ 15次(例如,在1000000次运行中,我们看到30512个零,30444个最大值和30301个重复,并且bc表示30512 * 2 ^ 15是999817216;其他运行具有相似的比率,包括max和/或repeat大于零的情况

1 个答案:

答案 0 :(得分:3)

当您运行dieharder时,您真正需要观察的列是p值列。

p值列基本上表示:&#34;这是真实随机数可能产生此结果的概率。&#34;您希望它在0和1之间均匀分布。

您还希望在可疑案件中多次运行它。例如,如果你有一个p值为(例如).03的列,那么如果你重新运行它,你仍然有.03(而不是一些更高的值)那么你可以高度放心随机数字生成器在该测试中表现不佳,而且不仅仅是3%的侥幸。但是,如果你获得了很高的价值,那么你可能正在考虑一个统计上的侥幸。但它会削减两种方式。

最终,了解随机或伪随机过程的事实很困难。但是,有了顽固分子,你就可以了解很多事情。