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

Gil*_*ili 128 java random

是什么区别Math.random() * nRandom.nextInt(n)在那里n是一个整数?

mat*_*t b 165

以下详细解释了为什么" Random.nextInt(n)Math.random() * nGili相关联的Sun论坛帖子中的" 更有效且更少偏见":

Math.random()在内部使用Random.nextDouble().

Random.nextDouble()使用Random.next()两次生成一个双尾,在其尾数中具有近似均匀分布的位,因此它均匀分布在0到1-(2 ^ -53)的范围内.

Random.nextInt(n)使用的Random.next()平均少于两次 - 它使用一次,如果获得的值高于MAX_INT以下n的最高倍数,它再次尝试,否则返回模数n(这个防止高于MAX_INT低于分布的n的最高倍数的值,因此返回一个均匀分布在0到n-1范围内的值.

在缩放6之前,Math.random()的输出是从均匀分布中提取的2 ^ 53个可能值之一.

按6缩放不会改变可能值的数量,并且转换为int然后将这些值强制为六个"桶"(0,1,2,3,4,5)中的一个,每个桶对应于包含任一值的范围1501199875790165或1501199875790166可能的值(因为6不是2 ^ 53的主管).这意味着对于足够数量的骰子卷(或具有足够大数量的侧面的骰子),骰子将显示其偏向朝向较大的耙子.

你会等很长时间来掷骰子让这个效果显现出来.

Math.random()也需要大约两倍的处理并且需要进行同步.

  • Random.nextInt和nextDouble也需要同步. (3认同)
  • @ΦXocę웃Пepeúpaツ这只是意味着某些数字比其他数字更有可能被绘制。因为它倾向于选择一些数字而不是其他数字(因此不是完全随机或没有足够大的样本大小统一) (2认同)
  • @ΦXocę웃Пepeúpaツ 将骰子上的 `6` 替换为 `5`:它将是“5-biased”。在您注意到骰子有问题之前,您可以掷骰子几次。在您注意到随机生成器出现问题之前,您必须进行极其复杂的彻底检查。 (2认同)

dfa*_*dfa 27

另一个重点是Random.nextInt(n)是可重复的,因为你可以使用相同的种子创建两个Random对象.Math.random()无法做到这一点.


Gil*_*ili 14

根据https://forums.oracle.com/forums/thread.jspa?messageID=6594485龵 Random.nextInt(n)更高效,更少偏见Math.random() * n

  • 我建议实际引用他的一些帖子并总结一下这里.该链接应该是您答案的补充. (18认同)