Java的随机数生成器。 生成数字的复杂性
我知道Java使用线性同余生成器。 我的问题是 – 生成随机数的复杂性是多少? 你如何进行这样的分析?
生成随机数的复杂性是O(1)。 你的意思是“它在运行时和内存方面的成本是多少”?
您可以使用微基准测量它们,例如junit-benchmark或Brent Boyer的Benchmark(参见最佳宏基准测试工具/框架的大量列表, 以测量Java中的单线程复杂算法? )。
此外,我认为Javas随机数生成器相当快,但统计上不好。 而是使用外部库,例如http://www.cs.gmu.edu/~sean/research/上的Mersenne Twister,或者,如果运行时对您来说非常重要,请使用Fast Mersenne Twister。
随机数发生器的时间复杂度为O(1)。 随着您拥有更多随机数,所需时间不会增加。
java.util.Random的随机性可能是个问题。 它使用2 ^ 48的种子,因此它会在这么多值之后重复。 这意味着nextLong()不会生成所有可能的值。
如果这是一个问题,你可以使用SecureRandom,它比较慢,但它重复的点要高得多。
根据文档 , java.util.Random.next
实现如下:
synchronized protected int next(int bits) { seed = (seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1); return (int)(seed >>> (48 - bits)); }
没有任何东西需要花费不同的时间,但这在很大程度上是因为它只处理固定长度的数字。
所以这是Java的随机数生成器,它甚至不是随机数生成器,而是伪随机数生成器,而不是非常好的生成器,如上所述。
也许你可以尝试计算复杂性中的文本:Oded Goldreich的伪随机生成器
“ 生成的复杂性:典型的选择是生成器必须在多项式时间(其输入的长度 – 种子)中工作。其他选择也将被讨论。我们注意到在发生器上没有计算要求(或或者,提出非常温和的要求,例如双指数运行时上限),产生“发电机”,可以欺骗任何亚指数大小的电路系列。“