Math.random()是否统一生成伪随机数?

时间:2017-07-02 20:10:33

标签: java random

this comment in another question中,dimo414指出OP代码的一个问题是它将非均匀地生成随机数。所以我想知道为什么会这样?它是固有的特定算法吗?或者是Math.random()本身的问题?是因为在区间[0.0,1.0)中选择的数字的浮点表示?

P.S。我理解使用Random.nextInt()的建议答案。我还想了解更多关于使用Math.random()的缺陷。

2 个答案:

答案 0 :(得分:0)

它几乎与Math.random()无关。 OP的帖子说真正需要说的是:

  

我的问题是,在几次不同的尝试中,最后一张牌   洗牌甲板始终与最后一张牌相同   没有洗过的甲板。

换句话说,每次代码运行时,洗牌后的牌组至少有一张与未洗牌牌组相同的牌。这绝对是确定性的,而不是随机的。

OP算法的至少一个问题是每次迭代都会将随机数乘以比前一次迭代更小的数字。

更好的方法是创建 52 随机数列表。然后将套牌中的每张卡分配给列表中的每个元素。然后按随机数对列表进行排序,结果就是洗牌。

答案 1 :(得分:0)

Java Math.random() documented返回的数字是"是伪随机选择的(大约)均匀分布来自"区间[0, 1)。但是,虽然该文档指定它使用自己的java.util.Random实例,但没有记录它如何使用该实例生成随机数。例如,没有记录该方法是否会调用nextDouble方法, 是为java.util.Random确切指定的。