是什么区别Math.random() * n和Random.nextInt(n)在那里n是一个整数?
这是Gili链接到的Sun论坛帖子中为什么“为什么比同时具有更高的效率和更少的偏见” 的详细说明:Random.nextInt(n)Math.random() * n
Random.nextInt(n)Math.random() * n
Math.random()内部使用Random.nextDouble()。
Math.random()
Random.nextDouble()
Random.nextDouble()两次使用Random.next()来生成一个在其尾数中具有近似均匀分布的位的double,因此它在0到1-(2 ^ -53)的范围内均匀分布。
Random.next()
1-(2 ^ -53)
Random.nextInt(n)平均使用Random.next()少于两次-它使用一次,并且如果获得的值大于MAX_INT以下的n的最高倍数,它将再次尝试,否则返回模n的值(这是防止高于MAX_INT的n的最高倍数的值倾斜),因此返回一个在0到n-1范围内均匀分布的值。
Random.nextInt(n)
在按比例缩放6之前,Math.random()的输出是从均匀分布得出的2 ^ 53个可能值之一。
Math.random(
缩放为6不会更改可能值的数量,然后将其强制转换为int会强制将这些值放入六个“存储桶”(0、1、2、3、4、5)之一,每个存储桶对应于涵盖其中一个范围的范围1501199875790165或1501199875790166的可能值(因为6不是2 ^ 53的视变数)。这意味着对于足够数量的骰子辊(或具有足够数量的侧面的骰子),骰子将显示自己偏向较大的铲斗。
1501199875790165
1501199875790166
2 ^ 53
您将要等待很长时间才能看到这种效果。
Math.random()还需要大约两次处理,并且需要进行同步。