Math.random() vs Random.nextInt(int)
整数之间的区别和位置是什么?Math.random() * n
Random.nextInt(n)
n
整数之间的区别和位置是什么?Math.random() * n
Random.nextInt(n)
n
以下是为什么“比Gili链接到的太阳论坛帖子更有效,更不偏不倚”的详细解释:Random.nextInt(n)
Math.random() * n
Math.random() 在内部使用 Random.nextDouble()。
Random.nextDouble() 使用 Random.next() 两次生成一个双精度值,该双精度值在其尾数中具有近似均匀分布的位,因此它在 0 到 1-(2^-53) 的范围内均匀分布。
Random.nextInt(n) 平均使用 Random.next() 少于两次 - 它使用它一次,如果获得的值高于 n 的最高倍数,MAX_INT它再次尝试,否则返回值模 n(这可以防止高于 n 的最高倍数的值低于 MAX_INT偏斜分布),因此返回一个均匀分布在 0 到 n-1 范围内的值。
在缩放 6 之前,Math.random() 的输出是从均匀分布中提取的 2^53 个可能值之一。
缩放 6 不会改变可能值的数量,并且强制转换为 int 会将这些值强制到六个“桶”(0、1、2、3、4、5)之一,每个存储桶对应于包含1501199875790165或1501199875790166个可能值的范围(因为 6 不是 2^53 的 disvisor)。这意味着对于足够数量的骰子掷骰子(或具有足够多边的骰子),骰子将显示自己偏向于较大的桶。
您将等待很长时间掷骰子才能显示此效果。
Math.random() 还需要大约两倍的处理,并且需要同步。
另一个要点是 Random.nextInt(n) 是可重复的,因为您可以使用相同的种子创建两个 Random 对象。这在 Math.random() 中是不可能的。