Math.random()如何用于数据分发?

时间:2017-04-28 09:10:53

标签: java

我在我的代码中使用Math.random()将数据分发到单独的存储桶中。 我想知道我是否在多个地方使用Math.random(),它是否使用不同的数字生成器或相同的静态方法。

代码示例:

France

在上面的代码中,它是否会对Math.random()调用使用相同的伪随机数生成器?

3 个答案:

答案 0 :(得分:2)

这里的真实答案是:阅读文档。

Math.random()的javadoc对此非常明确:

  

首次调用此方法时,它会创建一个新的伪随机数生成器,就像表达式

一样      

new java.util.Random()

     

此新的伪随机数生成器此后用于对此方法的所有调用,并且在其他任何地方都没有使用。

所以外卖:如果您对库类有疑问,请阅读这些类附带的文档。在元级别:努力回答"自己这样的问题;要求其他人解释可能看起来像是一个快速的绕道而行;但它实际上减慢你。

答案 1 :(得分:1)

是的,使用相同的发电机。第一次调用Math.random()时,会创建生成器的实例(调用内部new java.util.Random())并返回一个绘图。在后续调用中,该实例用于生成下一个数字。

小点,您应该使用>= 0.5。这是因为绘图包含0.0但不包括1.0,而0.5可以完全表示为java double。您当前的方式引入c2的统计偏差,支持c1,但可能不比生成器本身差。

答案 2 :(得分:1)

  

它会为Math.random()调用使用相同的伪随机数生成器吗?

会;但是如果你想明确地将它作为参数传递给方法:

public void assignVariant1(Random r) {
  // ...
  if (r.nextDouble() > 0.5) {
    // ...
  }
  if (r.nextDouble() > 0.5) {
    // ...
  }
  // ...
}

每次使用相同的Random实例都非常明确。

但真正的优势在于它允许您通过传入具有已知种子的Random实例来重复测试该方法。