在不同的jvms或不同的机器上java中Math.random()的随机性如何

时间:2012-04-01 10:44:39

标签: java random

我在许多不同的物理服务器上有一个大型分布式程序,每个程序产生许多线程,每个线程在其操作中使用Math.random()来从许多公共资源池中绘制一块。

目标是在所有操作中均匀使用池。有时候,通过查看资源池上的快照看看它在那一瞬间得到了哪些碎片(实际上可能是这样,但很难测量并确定无误),它看起来并不是随机的。

是否有比Math.random()更好的东西并且表现得更好(至少不是更差)?

4 个答案:

答案 0 :(得分:2)

Math.random()基于java.util.Random,基于linear congruential generator。这意味着它的随机性并不完美,但对于大多数任务来说已经足够好了,听起来它应该足以完成你的任务。

但是,听起来您使用double返回值Math.random()来在固定数量的选项之间进行选择,这可能会进一步降低随机性的质量。最好使用java.util.Random.nextInt() - 只需确保重用相同的Random对象。

  

有时,通过查看资源池上的快照来查看当时正在获取的部分,它看起来并不是随机的

我们的大脑非常擅长以完美的随机性发现模式,因此几乎没有任何意义。

答案 1 :(得分:1)

Math.Random的算法对于任何平台都是“足够随机”的。用于创建伪随机数的数学模型是一个很好的模型。这取决于您使用的线程数。对于除了非常多的线程之外的任何东西,这都不会给你甚至分布(随机数的性质),然后Math.random()会给你足够的开销。

尝试一个更好的选择:创建一个资源池类,它可以均匀地分配它们 - 然后只保留它在“distribute”方法中的关键部分受保护。

答案 2 :(得分:0)

这个帖子很有用: How good is java.util.Random?

另一种选择:

  • 在初始化随机实例时生成随机种子
  • 如果你使用linux使用/ dev / urandom

答案 3 :(得分:0)

根据javadoc,Math.random()只是一种使用java.util.Random的简单方法。这说它只是一个伪随机算法。检查algorythm的随机性的简单方法是在x / y网格上绘制随机点。你不应该找到任何模式。

要获得真实的ramdom数字,您可以使用http://www.random.org等服务。如果这样做很慢,可以定期调用它来播种java.util.Random可以让你更接近真随机。