在n为整数的情况下,Math.random() * n和Random.nextInt(n)有什么区别?
发布于 2009-04-10 19:37:09
这里是为什么"Random.nextInt(n)比Math.random() * n更高效,更少偏见“的the detailed explanation,来自太阳论坛的帖子,吉利链接到:
Math.random()在内部使用Random.nextDouble()。Random.nextDouble()两次使用Random.next()生成一个双精度数,该双精度数在尾数中具有近似均匀分布的位,因此它均匀分布在0到1-(2^-53)的范围内。
Random.nextInt(n)平均使用Random.next()不到两次-它使用一次,如果获得的值大于低于MAX_INT的n的最大倍数,它将再次尝试,否则is返回取模n的值(这可以防止高于MAX_INT以下的n的最大倍数的值扭曲分布),因此返回一个在0到n-1范围内均匀分布的值。
在缩放到6之前,Math.random()的输出是从均匀分布中提取的2^53个可能值中的一个。
按6缩放不会改变可能值的数量,然后强制将这些值转换为六个“桶”(0,1,2,3,4,5)中的一个,每个桶对应于包含1501199875790165或1501199875790166的可能值的范围(因为6不是2^53的除数)。这意味着,对于足够数量的掷骰子(或具有足够大数量的边的骰子),骰子将显示其自身偏向于较大的桶。
你将等待很长一段时间的掷骰子,以此效果显示。
Math.random()也需要大约两倍的处理,并且需要进行同步。
发布于 2009-04-10 19:45:12
另一个要点是Random.nextInt(n)是可重复的,因为您可以用相同的种子创建两个Random对象。这在Math.random()中是不可能的。
发布于 2009-04-10 19:30:12
根据https://forums.oracle.com/forums/thread.jspa?messageID=6594485�的说法,Random.nextInt(n)比Math.random() * n更有效且更少偏见
https://stackoverflow.com/questions/738629
复制相似问题