伪随机数发生器

时间:2009-02-25 03:08:27

标签: language-agnostic random

创建最佳伪随机数生成器的最佳方法是什么? (任何语言都有效)

11 个答案:

答案 0 :(得分:26)

创建一个的最好方法是不要。

Pseudo-random number generators是一个非常复杂的主题,所以最好使用那些对该主题有很好理解的人们所做的实现。

答案 1 :(得分:10)

这一切都取决于应用程序。例如,创建“最随机”数字的生成器可能不是最快或最具内存效率的生成器。

Mersenne Twister算法是一种流行的,相当快速的伪随机数生成器,可以产生非常好的结果。它有一个非常大的时期,但也是一个相对巨大的状态(2.5 kB)。但是,对于加密应用程序而言,它被认为不够好。

更新:由于这个答案已经写好,PCG family of algorithms已经发布,似乎在大多数方面(速度,内存,随机性和周期)都优于现有的非加密算法,任何but cryptography的完美选择。

如果你正在加密,我的答案仍然是:不要自己动手。

答案 2 :(得分:6)

德国杂志C't在2/2009期刊中测试了许多软件和硬件生成器,并通过各种统计测试来运行结果。

我扫描了结果here

我不打算写我自己的。文章提到甚至唐纳德克努特也没有使用他的“超级随机数发生器”,这毕竟不是随机的。得到一个通过所有测试(在所有列中得到结果> 0)。他们还测试了采用VIA EPIA M10000主板的设置,该主板具有硬件RNG。我喜欢这种商业或半商业设置的选项,它需要一个具有高吞吐量的强大的随机数服务器。

当然,除非您正在玩游戏,否则this可能已经足够好了。

答案 3 :(得分:5)

PRNG算法很复杂,正如获取正确的熵源以使它们运行良好一样。这不是你想要自己做的事情。每种现代语言都有一个PRNG库,几乎可以肯定适合您的使用。

xkcd random number

答案 4 :(得分:3)

Yikes,这会让VEEEEEERY变得复杂!对于如何测量随机数生成器的“随机性”似乎有很多指标,因此很难测量哪些是“最佳”的。我会从Numerical Recipes in C(或者你能找到的任何语言)开始,举几个例子。我从那里给出的例子中编写了我的第一个简单的。

编辑:从确定您需要随机数生成器的复杂程度开始也很重要。我记得在C年前我发现默认的随机数发生器有一个大约32,767的周期,这意味着在生成那么多数字之后它会定期重复,这让我记忆犹新!如果你需要几个骰子,那很好。但是,当您需要为模拟生成数百万个“随机”值时。

答案 5 :(得分:1)

答案 6 :(得分:1)

请参阅TestU01测试套件的此链接,其中包括几组测试。

http://www.iro.umontreal.ca/~simardr/testu01/tu01.html

在论文中,作者演示了各种现有RNG的测试结果,而不是.NET System.Random(据我所知)。虽然他测试了VB6的发生器。

很少有人通过所有考试......

答案 7 :(得分:0)

从knuth seminumeric中偷出一个。 它质量高,易于实施。 它使用一对数组,加法和几个ifs。 如果我没记错的话,便宜,有效,且长期很长2 ^ 55。

答案 8 :(得分:0)

如果您打算使用C ++,Boost有一系列PRNG,我比标准库中的任何东西都要多得多。 documentation可能有助于挑出一个。与往常一样,PRNG的好坏取决于您使用它的目的。

答案 9 :(得分:0)

https://github.com/fsssosei/Pure_PRNG 用于通过统计测试的 PRNG 算法的 Python 库

答案 10 :(得分:-3)