为什么 16 位 LFSR 可以通过所有 Diehard 测试?
Why does a 16bit LFSR pass all Diehard tests?
我在硬件中实现了 LFSR。它基于维基百科页面中的 LFSR。它具有相同的输出。
它通过了顽固派的所有测试,但是,如果我绘制这些对,我会在 2D 中得到这不是很随机的线条
那么,我怎样才能有一个强大的统计测试来证明这个 PRNG 并不理想呢?
已解决:
我必须使用命令
dieharder -a -f exemple_LSRF_BS_1_DH.txt -g 202
并在输出文件中添加 header 我有我的号码。
从你的情节来看,我猜你的随机比特流在每个周期后发出整个寄存器,而不是每个周期只发出一个比特。这意味着当被视为 16 位字时,x_(n+1)
是 X_n / 2
或 X_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。
我在硬件中实现了 LFSR。它基于维基百科页面中的 LFSR。它具有相同的输出。
它通过了顽固派的所有测试,但是,如果我绘制这些对,我会在 2D 中得到这不是很随机的线条
那么,我怎样才能有一个强大的统计测试来证明这个 PRNG 并不理想呢?
已解决:
我必须使用命令
dieharder -a -f exemple_LSRF_BS_1_DH.txt -g 202
并在输出文件中添加 header 我有我的号码。
从你的情节来看,我猜你的随机比特流在每个周期后发出整个寄存器,而不是每个周期只发出一个比特。这意味着当被视为 16 位字时,x_(n+1)
是 X_n / 2
或 X_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。