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

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

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

它几乎与Math.random()无关。 OP的post说真的需要说:

我的问题是,在几次不同的尝试中,洗牌的牌组中的最后一张牌与未洗牌的牌组中的最后一张牌一致。

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

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

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

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