我在许多不同的物理服务器上有一个大型分布式程序,每个程序产生许多线程,每个线程在其操作中使用Math.random()
来从许多公共资源池中绘制一块。
目标是在所有操作中均匀使用池。有时候,通过查看资源池上的快照看看它在那一瞬间得到了哪些碎片(实际上可能是这样,但很难测量并确定无误),它看起来并不是随机的。
是否有比Math.random()
更好的东西并且表现得更好(至少不是更差)?
答案 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)
答案 3 :(得分:0)
根据javadoc,Math.random()只是一种使用java.util.Random的简单方法。这说它只是一个伪随机算法。检查algorythm的随机性的简单方法是在x / y网格上绘制随机点。你不应该找到任何模式。
要获得真实的ramdom数字,您可以使用http://www.random.org等服务。如果这样做很慢,可以定期调用它来播种java.util.Random可以让你更接近真随机。