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

use*_*480 12 java random

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

目标是在所有操作中均匀地使用池.有时,通过查看资源池上的快照看它在那一瞬间得到哪些部分(实际上可能是这样,但很难测量并确定),它似乎并不是随机的.

是否有比这更好的东西Math.random()(至少不是更糟)?

Mic*_*rdt 3

Math.random()基于java.util.Random,基于线性同余生成器。这意味着它的随机性并不完美,但对于大多数任务来说已经足够好了,而且听起来它应该足以满足您的任务。

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

有时,通过查看资源池上的快照来查看当时获得的片段,它看起来并不那么随机

我们的大脑非常擅长发现完全随机的模式,所以这几乎没有任何意义。