为什么 16 位 LFSR 可以通过所有 Diehard 测试?

Why does a 16bit LFSR pass all Diehard tests?

我在硬件中实现了 LFSR。它基于维基百科页面中的 LFSR。它具有相同的输出。

它通过了顽固派的所有测试,但是,如果我绘制这些对,我会在 2D 中得到这不是很随机的线条

2D plot of the LFSR

那么,我怎样才能有一个强大的统计测试来证明这个 PRNG 并不理想呢?

已解决:

我必须使用命令

dieharder -a -f exemple_LSRF_BS_1_DH.txt -g 202

并在输出文件中添加 header 我有我的号码。

从你的情节来看,我猜你的随机比特流在每个周期后发出整个寄存器,而不是每个周期只发出一个比特。这意味着当被视为 16 位字时,x_(n+1)X_n / 2X_n / 2 + 32768。这表现为两条梯度为 0.5(或 2.0,取决于顺序 and/or 移位方向)的对角线。

LFSR 的正常使用会每个周期发出一个位,或者每 n 个周期发出所有 n 位。这确实会产生一些负面特性,但它们并不像您所展示的那样明显。

至于为什么你的测试不及格?我认为您的测试设置中一定存在缺陷。我修改了 Wikipedia 中的代码以在标准输出上的每个周期发出 16 位状态,并将其通过管道传输到 dieharder -a -g200,但它在前五次测试中立即失败。这就是人们所期望的;甚至 hexdump -C 也显示出明显的可见模式。

修改代码以每 16 个周期发出 16 位状态,hexdump -C 看起来更加随机,但顽固分子仍然失败。

可能是你没有指定生成器源给dieharder,所以它使用了它默认的内部生成器。您可以在输出的第五行确认这一点:

   rng_name    |rands/second|   Seed   |
        mt19937|  1.42e+08  |1473327481|

即便如此,如果您想对生成器进行更彻底的测试,请查看 TestU01