Fortuna或Mersenne Twister是否更适合作为算法RNG?


19

最近的回答提到使用FortunaMersenne Twister随机数生成器(RNG)进行蒙特卡洛模拟。我之前没有听说过Fortuna,所以我查了一下-看起来它主要是供加密使用的。

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

哪种(Fortuna或Mersenne Twister)被认为是“算法播种”应用程序的最佳选择(例如Monte Carlo和K-Means播种)?还是“扔掉”-即使用最方便。

在我所坐的地方,“最佳”应该提供最高质量的随机数,可以快速运行,并且(可能)占用的内存少。其中,质量对于我们大多数人来说可能是最重要的。


6
加密PRNG往往比大多数其他PRNG慢。如果您在进行蒙特卡洛模拟,其中PRNG运算数以百万计,那么您会发现加密方法非常昂贵。
JM

1
@JM-更详细一点,我想您的评论将是一个很好的答案。看看是否可以使用现代硬件加速的加密功能来创建高性能的加密安全伪随机数流将是很有趣的。
Mark Booth,

大约是加密的RNG @JM好点慢-马克对财神
winwaed

继承人PRNG的和许多不同的统计的一个很好的列表,你会发现有用希望它有助于> boost.org/doc/libs/1_48_0/doc/html/boost_random/...
pyCthon

我的cstdlib问题是粒度-仅RAND_MAX=32768可能的值。我目前正在将MT用于Monte Carlo光线追踪模拟。但是,我认为MT是我的探查器中的性能瓶颈,可能是因为我在预处理过程中 “随机”生成了诸如光线方向之类的东西。例如,我可能在启动时生成100,000个射线的数组,将它们存储在一个数组中,然后在运行时随机选择数组的开始位置(运行约10,000个射线)。这具有相对较高的存储开销,以换取良好的随机数分布。
bobobobo 2012年

Answers:


14

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

  1. 足以应付家庭作业。
  2. 足以打赌您的公司。
  3. 足以打赌您的国家。

线性同余PRNG(通常在大多数库中实现的方法)固定在类别1中。Fortuna和Mersenne Twister都固定在类别2中。

对于一篇有趣的文章,介绍如何弄乱混洗算法可能使您的公司/赌场蒙受损失,我建议您从1999年开始使用它。由于链接腐烂,图像消失了,但是图4中的一组平行线是将PRNG中的下一个数字与上一个生成的数字作图的位置。

正如JM所指出的,Fortuna的运行速度很慢。正如您所指出的,梅森·Twister相当快。


2
快速浏览本文的可打印版本,“图4”似乎是代码而不是图片。“图5”看上去过时了,但是是我从拿到了图像Wayback机器
JM

谢谢。在这种情况下,速度似乎是抵制Fortuna的标志。回覆。不好的洗牌:是的,我知道的很多(不多!)很容易“撤消” RNG的随机性-例如,通过选择不好的起始种子。
2011年

另一个具有更好图片的版本位于: cigital.com/papers/download/developer_gambling.php
Tangurena,2012年

1
具有32位输出的96位LCG比Mersenne Twisters通过更多的统计测试。如今,任何人都不应使用Mersenne Twister,因为要在每个有意义的方面制作出比MT更好的体面的非加密PRNG非常容易。
Veedrac '17

4

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

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

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


/ dev / urandom可安全地用于linux和free-bsd上的加密。看看这个答案
Adam Kurkiewicz

对于仿真,为什么随机数为真是理想的功能?当然,某些伪随机数生成器会更糟,但出于所有实际目的,它们将是同等的。那么,为什么您认为真实性本身就是一个好特征?
Wrzlprmft

2

我想说的是,最近我已经通过模拟完成了这个过程,我应该注意的是,是否真的有必要使用Fortuna。在我们的案例中,我们担心MT的熵不够高,这会在我们的模拟中转化为偏差。因此,对于我们的仿真,我们使用Fortuna从该算法中提取了约650亿个随机数。重要的是,计算机速度很快,如果您确实有需要,可以使用它。如果您只是要进行蒙特卡洛集成,请坚持使用MT。


0

我认为答案很大程度上取决于您打算使用RNG的应用程序。我建议对Tangurena进行粗略分类的第四类:“好,没有实际收益”。

对于许多应用程序而言,这可能根本没有关系,并且适当的加密级RNG可能只会降低您的任务速度,而没有任何相应的有效性提高。例如,我所做的许多研究仅需要来自我指定的分布的许多,数百万个数字。几乎所有的RNG都可以做,所以我所需要的只是一个没有灾难性的贫困到不能 RNG 那样一文不值的人。其他任何事情都只会不必要地减慢工作速度。我倾向于使用Mersenne Twister,但这仅仅是因为它足够好用,我有代码,而且速度相当快。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.