创建最佳伪随机数生成器的最佳方法是什么? (任何语言都有效)
答案 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库,几乎可以肯定适合您的使用。
答案 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)