gpt4 book ai didi

java - 为什么 Math.random 忽略最后一个元素?

转载 作者:行者123 更新时间:2023-12-01 16:48:46 24 4
gpt4 key购买 nike

我正在创建一个简单的方法来模拟洗牌。我的想法是存储原始牌组的大小,只要大小不为负就重复循环。

在循环期间,我从列表中复制一个对象(卡片),并将其放置在另一个列表中。从原始列表中删除,并恢复循环。

while(size >= 0){
int random = (int) ((Math.random() * size) + 0);
shuffledDeck.add(this.orderedDeck.get(random));
orderedDeck.remove(random);
size--;
}

这个特定牌组的大小是

int size = this.getDeckSize()-1; //51 (52 cards, from 0 to 51)

我的问题是,在几次不同的尝试中,洗牌牌组中的最后一张牌始终与未洗牌牌组中的最后一张牌相同。这表明random永远不等于size-1 .

<小时/>

我怎样才能让最后一张牌实际上能够被洗牌?

(换句话说,为什么 random 等于 size-1 ?)

最佳答案

Math.random() 永远不会返回 1.0,如 docs解释一下:

Returns a double value with a positive sign, greater than or equal to 0.0 and less than 1.0.

即使它确实返回 1.0,它也会以很小的概率返回,并且您的代码会将任何其他值向下舍入,因此您仍然不会统一获得您想要的结果。

正如其他人所指出的,您的代码中存在一些进一步的算术错误,但即使纠正它们也不会产生正确分布的随机值。

您不应使用 Math.random() 来执行此任务 - 而是使用 Random.nextInt(n) ,旨在正确返回所需范围内的统一值。

正确处理随机数据源是很棘手的。根据经验,如果您发现自己对随机值进行算术运算,则很可能您做错了什么(例如生成不均匀的结果),您应该寻找一个现有的函数来提供您正在寻找的随机性类型来代替。

关于java - 为什么 Math.random 忽略最后一个元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44873582/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com