WELL 伪随机数代

计算科学 表现 C 随机数生成
2021-12-07 11:45:20

我已MT19937在测试工具中使用以生成统一(无符号)32 位 [0,232- 1] 值,基于原始作者的mt19937.c实现,以生成(基本上取之不尽的)统计随机位八位字节流的供应。这代替了 CSPRNG,这对于这些特定测试不是必需的。但是,我最近一直在考虑WELLPRNG——不是因为统计特性本身(两者似乎都足以满足我的需求)——但它们似乎暗示了更有效的实现。

我缺乏学术论文的数学背景,尽管我至少可以遵循“扭曲”矩阵和前者的回火变换。然而,函数作者提供的大部分代码WELL-n似乎都集中在浮点生成上,并带有一些神奇的浮点常量(例如,2.32830643653869628906e-10)。是否可以从WELL代码中省略步骤以提供统一的 32 位分布?或者该算法是专门为浮点分布设计/偏向的?

或者我认为WELL会在满足我的要求的同时为“批量”uint32 向量生成带来性能提升的想法是错误的?

1个回答

我想大多数随机数生成器的用户最终都会对浮点值感兴趣。这就是存在面向双精度 SIMD 的快速梅森捻线器 (dSFMT) 的原因。但是,有用于返回的 WELL RNG 的更新 C 代码。unsigned long查看代码,似乎早期版本正在转换unsigned longdouble因此您可以通过比较两者来弄清楚它们在做什么。

如果您主要关心速度,我认为这不是您的 PRNG。作者提到的速度/性能不是算法生成随机变量的速度,而是它从糟糕的初始化中恢复的速度这改进了 WELL 生成器的统计特性。有关这意味着什么的详细信息,请参阅Mutsuo Saito 硕士论文 (PDF) 的第 6 部分。此类测试是在人为的最坏情况初始状态下执行的,因此我不清楚一般使用的效果是什么。

随机数生成可能非常昂贵(通常尽管有直觉),并且如果您的代码花费合理的时间生成随机值,那么它是一个非常好的优化候选者。在我自己的简单性能测试(Retina MacBook Pro、OS X 10.9)中,我发现WELL RNG在生成值时的速度大约是当前基于整数的SIMD 导向的 Fast Mersenne Twister (SFMT)的三分之一uint32SFMT也支持uint64. 我还发现经典mt19937ar.c代码的速度大约是SFMT.