我在我的代码中使用Math.random()将数据分发到单独的存储桶中。 我想知道我是否在多个地方使用Math.random(),它是否使用不同的数字生成器或相同的静态方法。
代码示例:
France
在上面的代码中,它是否会对Math.random()调用使用相同的伪随机数生成器?
答案 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
实例来重复测试该方法。