是什么区别Math.random() * n和Random.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()也需要大约两倍的处理并且需要进行同步.
Gil*_*ili 14
根据https://forums.oracle.com/forums/thread.jspa?messageID=6594485龵 Random.nextInt(n)更高效,更少偏见Math.random() * n