一尘不染

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

java

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


阅读 484

收藏
2020-03-01

共1个答案

一尘不染

这是Gili链接到的Sun论坛帖子中为什么“为什么比同时具有更高的效率和更少的偏见” 的详细说明:Random.nextInt(n)Math.random() * n

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

Random.nextDouble()两次使用Random.next()来生成一个在其尾数中具有近似均匀分布的位的double,因此它在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)之一,每个存储桶对应于涵盖其中一个范围的范围15011998757901651501199875790166的可能值(因为6不是2 ^ 53的视变数)。这意味着对于足够数量的骰子辊(或具有足够数量的侧面的骰子),骰子将显示自己偏向较大的铲斗。

您将要等待很长时间才能看到这种效果。

Math.random()还需要大约两次处理,并且需要进行同步。

2020-03-01