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

java中Math.random()在不同JVM或不同机器上的随机性如何,java,random,Java,Random,我有一个跨许多不同物理服务器的大型分布式程序,每个程序生成许多线程,每个线程在其操作中使用Math.random(),从许多公共资源池中提取一部分 目标是在所有操作中均匀利用池。有时,通过查看资源池上的快照来查看它在那一刻得到的是哪些片段(实际上可能是,但很难测量和确定),就不会显得如此随机 有什么东西比Math.random()更好,性能也一样好(至少不会差太多)?这个线程非常有用: 其他备选方案: 在初始化随机实例时生成随机种子 如果您使用linux,请使用/dev/uradom 数学。

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

目标是在所有操作中均匀利用池。有时,通过查看资源池上的快照来查看它在那一刻得到的是哪些片段(实际上可能是,但很难测量和确定),就不会显得如此随机


有什么东西比Math.random()更好,性能也一样好(至少不会差太多)?

这个线程非常有用:

其他备选方案:

  • 在初始化随机实例时生成随机种子
  • 如果您使用linux,请使用/dev/uradom

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


      尝试一个更好的选择:创建一个资源池类,使它们均匀分布,然后只需保护“distribute”方法中的关键部分。

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

      要获得真正的ramdom数字,您可以使用以下服务。如果这会变慢,可能会定期调用它来种子java.util.Random可以让您更接近真正的随机。

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

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

      有时,通过查看资源池上的快照来查看它在那一刻得到的是哪些片段,就不会显得如此随机


      我们的大脑真的很擅长在完全随机的情况下发现模式,所以这几乎毫无意义。

      +1问个好问题。如果你找到答案,请让我知道:)请查看以下链接。为什么不为公共资源池使用一些调度程序?@vitalik:资源池前面的任何类型的控制器/调度程序都需要协调,降低性能,在这种情况下会造成灾难性的复杂性。@用户未知:他使用的是Math.random(),这是他绝对不会犯的一个错误。为什么随机数不能给你一个均匀分布?在我的例子中,每个程序的线程数只有几百个,但每个线程执行许多操作(每秒1个,每个操作调用Math.random())。资源池类如何随机分配资源?它必须使用Math.random()吗?您不需要随机分发它,只需创建一个名为Resources的简单类,一个synchronized nextResource()方法。这样你就可以一个接一个地检查它们,确保分布均匀。此外,除了少数非常特殊的情况外,使用数百个线程会产生比节省时间更多的开销;您应该将线程数量限制在您的系统可以有效使用的范围内。我不想从Java调用外部进程,因为它会降低性能,我以每秒1个操作的速度运行,而且有很多(几十万或百万个)因此,我能做的最简单的事情就是创建一个周期更长的生成器(如链接中所述)。您还必须记住,获得1,1,1,1,1的机会与451002783199,6的机会相同。新java.util.Random()如何获得一个可能不同的种子?Random.nextInt()有一个很好的观点,目前我只需将随机双精度乘以n,然后将其四舍五入到最接近的整数,这与Random()有很大的不同。nextInt()?@user881480:yes-Random生成整数,Math.Random()会额外将其转换为double,只会将其转换回int。这种双精度转换可能会降低随机性的质量(不是很确定,但可能是)。