【发布时间】:2018-09-26 18:53:20
【问题描述】:
我最近发现 _mm_crc32_* intel 内在指令可用于生成(伪)随机 32 位数字。
#include <nmmintrin.h> /* needs CRC32C instruction from SSE4.2 instruction set extension */
uint32_t rnd = 1; /* initialize with seed != 0 */
/* period length is 4,294,967,295 = 2^32-1 */
while (1) {
#if 0 // this was faster but worse than xorshift32 (fails more tests)
// rnd = _mm_crc32_u8(rnd, rnd >> 3);
#else // this is faster and better than xorshift32 (fails fewer tests)
rnd = _mm_crc32_u32(rnd, rnd << 18);
#endif
printf("%08X\n", rnd);
}
此方法与 LCG 一样快,并且比 xorshift32 更快。维基百科说,由于 xorshift 生成器“未能通过一些统计测试,因此被指责为不可靠”。
现在我想知道 CRC32C 方法是否通过了对随机数生成器进行的各种测试。我只是通过尝试使用 PAQ8 压缩器(失败)进行压缩来验证每一位,甚至是 LSB,都是“随机的”。有人可以帮我做更好的测试吗?
编辑:使用建议的 TestU01 套件中的测试,我之前使用的方法结果证明比 xorshift32 更差。如果有人有兴趣使用更好的版本,我已经更新了上面的源代码。
【问题讨论】:
-
什么是“好”?这些数字在哪里使用?它们是否需要被第三方不可预测?
-
可压缩性是对 RNG 质量的一个非常弱的测试,尤其是对于任何通用压缩器。显然,流的Kolmogorov complexity 只是起始值+ CRC 算法或问题中的代码。任何知道如何生成随机数的人都可以在给定一个 32 位值的情况下生成所有未来的随机数。
-
我感兴趣的是,在对它们进行的统计测试中,所呈现的生成器是否比 xorshift 32 更差或更好。伪随机数生成器始终是可预测的,我认为它是可预测的。
-
我测试了移位方向、长度和 _u8 与 _u32 的各种组合。这个周期最长,与“_mm_crc32_u32(rnd, rnd
-
这里有使用的测试的描述。基本上它着眼于随时间和范围的分布iro.umontreal.ca/~lecuyer/myftp/papers/xorshift.pdf
标签: c math random x86-64 crc32