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

问题

有什么区别218189835和Random.nextInt(n)其中n是整数?


#1 热门回答(145 赞)

这里是2,339529545为什么"Random.nextInt(n)既有效率又低于Math.random() * n",来自Gili链接的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()也需要大约两倍的处理并且需要进行同步。


#2 热门回答(26 赞)

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


#3 热门回答(14 赞)

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