首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Math.random()与Random.nextInt(int)

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

Stack Overflow用户
提问于 2009-04-10 19:29:10
回答 4查看 141.5K关注 0票数 143

n为整数的情况下,Math.random() * nRandom.nextInt(n)有什么区别?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 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()也需要大约两倍的处理,并且需要进行同步。

票数 181
EN

Stack Overflow用户

发布于 2009-04-10 19:45:12

另一个要点是Random.nextInt(n)是可重复的,因为您可以用相同的种子创建两个Random对象。这在Math.random()中是不可能的。

票数 28
EN

Stack Overflow用户

发布于 2009-04-10 19:30:12

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

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/738629

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档