Fortuna 或 Mersenne Twister 作为算法 RNG 更可取吗?

计算科学 算法 随机数生成
2021-11-28 21:59:29

最近的一个回答提到了使用FortunaMersenne Twister随机数生成器 ( RNG ) 来播种Monte Carlo 模拟我以前没有听说过 Fortuna,所以我查了一下——看起来它主要用于加密用途。

我目前在生产代码中使用 Mersenne Twister 来播种 K-Means 算法。

哪个(Fortuna 或 Mersenne Twister)被认为最适合“算法播种”应用程序(例如播种 Monte Carlo 和 K-Means)?或者是“折腾”——即使用最方便。

从我所在的位置来看,“最佳”应该提供最高质量的随机数,快速运行,并且(可能)具有低内存占用。其中,质量对我们大多数人来说可能是最重要的。

4个回答

好吧,一切都是某种形式的权衡。对于随机数生成器,我将它们分为 3 个基本类别:

  1. 足够好做家庭作业了。
  2. 足以押注您的公司。
  3. 好到可以押注你的国家。

线性同余 PRNG(通常在大多数库中实现的方法)完全属于第 1 类。Fortuna 和 Mersenne Twister 都属于第 2 类。

有关如何弄乱洗牌算法会导致您的公司/赌场损失的有趣文章,我推荐1999 年的这篇文章。由于链接腐烂,图像消失了,但图 4 是一组平行线,您将 PRNG 中的下一个数字与生成的前一个数字相比较。

正如 JM 指出的那样,Fortuna 很慢。正如您所指出的,Mersenne Twister 相当快。

我认为“加密”类别中的默认选择是Blum-Blum-Shub正如维基百科页面已经说过的那样,这不适合模拟,因为它太慢了。

如果您在类似 unix 的系统上运行,那么您还可以考虑直接从/dev/urandom获取随机数,该操作系统服务提供良好(尽管不一定是加密)质量的随机数。根据您使用的特定操作系统,这可能会使用 Yarrow 算法 - Fortuna 是其中的一种变体。但最有趣的方面是操作系统可以访问一些真正的随机数:例如来自内部温度传感器的热噪声。通常,只要这些数据可用以保持数据不可预测,就会将这些数据混合到随机池中。

这种随机性混合的概念表明,有可能获得两全其美的效果,如下所示。使用更快、质量相当好的随机数生成器(例如 Mersenne)作为您的基本 RNG。还要维护第二个质量更好的随机数生成器 - 例如 Fortuna。每隔这么多数字,比如 25,运行一次更好的 RNG 迭代,并将结果添加到基本 RNG 的状态中。这样,您将获得相当高的性能和相当高质量的结果。(我猜它对于加密来说是没有用的,因为这个复合生成器的强度很可能是最薄弱环节的强度。但是对于通常没有恶意对手的模拟,它可能会起作用。)

我想插话说,我最近通过模拟完成了这个过程,我应该注意,如果真的有必要,使用 Fortuna 并不是不可能的。在我们的案例中,我们担心 MT 的熵不够高,这会在我们的模拟中转化为偏差。因此,在我们的模拟中,我们使用 Fortuna 从该算法中提取了大约 650 亿个随机数。重点是,计算机速度很快,如果你真的需要,如果你有理由可以使用它。如果您只是在做类似蒙特卡罗集成的事情,请坚持使用 MT。

我认为答案很大程度上取决于您打算使用 RNG 的应用程序。我会建议 Tangurena 粗略分类的第四类:“没有真正收获的好”。

对于许多应用程序来说,这可能根本无关紧要,正确的加密级 RNG 可能只会减慢您的任务,而不会获得任何相应的有效性增益。例如,我所做的大部分研究只需要大量来自我指定的分布的数百万个数字。几乎任何 RNG 都可以,所以我所需要的只是一个不会RNG 那样一文不值的灾难性贫困。其他任何事情都只会不必要地减慢工作速度。我倾向于使用 Mersenne Twister,但这仅仅是因为它运行良好,我有代码,而且速度相当快。