Math.random() vs Random.nextInt(int)

2022-08-31 07:48:49

整数之间的区别和位置是什么?Math.random() * nRandom.nextInt(n)n


答案 1

以下是为什么“比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() 还需要大约两倍的处理,并且需要同步。


答案 2

另一个要点是 Random.nextInt(n) 是可重复的,因为您可以使用相同的种子创建两个 Random 对象。这在 Math.random() 中是不可能的。


推荐