我知道Java使用线性同余生成器。我的问题是 - 生成随机数的复杂性是多少?你如何进行这样的分析?
答案 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)
根据docs,java.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
生成的复杂性:典型的选择是 生成器必须在多项式时间内工作(输入的长度 - 种子)。还将讨论其他选择。我们注意到放置 对发电机没有计算要求(或者, 提出非常温和的要求,如双指数 运行时上限),产生可以欺骗任何人的“生成器” 亚指数大小的电路系列。“