Java的随机数生成器。生成数字的复杂性

时间:2011-09-03 08:00:58

标签: java algorithm random

我知道Java使用线性同余生成器。我的问题是 - 生成随机数的复杂性是多少?你如何进行这样的分析?

4 个答案:

答案 0 :(得分:7)

生成 a 随机数的复杂性为O(1)。你的意思是“它在运行时和内存方面的成本是多少”?

您可以使用微基准测量它们,例如junit-benchmark或Brent Boyer的基准(见What is the best macro-benchmarking tool / framework to measure a single-threaded complex algorithm in Java?的大量此类工具列表)。

此外,我认为Javas随机数生成器相当快,但统计上不好。而是使用外部库,例如在http://www.cs.gmu.edu/~sean/research/的Mersenne Twister,或者,如果运行时对你来说非常重要,那就是Fast Mersenne Twister。

答案 1 :(得分:5)

随机数发生器的时间复杂度为O(1)。由于您有更多的随机数,所需的时间不会增加。

java.util.Random的随机性可能是个问题。它使用2 ^ 48的种子,因此它会在这么多值之后重复。这意味着nextLong()不会生成所有可能的值。

如果这是一个问题,你可以使用SecureRandom,它比较慢,但它重复的点要高得多。

答案 2 :(得分:3)

根据docsjava.util.Random.next的实施方式如下:

 synchronized protected int next(int bits) {
   seed = (seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1);
   return (int)(seed >>> (48 - bits));
 }

那里没有任何东西需要花费不同的时间,但这在很大程度上是因为它只处理固定长度的数字。

这就是Java的随机数生成器,它甚至不是一个随机数生成器,而是一个伪随机数生成器,而不是那个非常好的生成器,如上所述。

答案 3 :(得分:0)

也许你可以尝试Texts in Computational Complexity: Pseudorandom Generators by Oded Goldreich

   生成的复杂性:典型的选择是   生成器必须在多项式时间内工作(输入的长度 -   种子)。还将讨论其他选择。我们注意到放置   对发电机没有计算要求(或者,   提出非常温和的要求,如双指数   运行时上限),产生可以欺骗任何人的“生成器”   亚指数大小的电路系列。“