gpt4 book ai didi

java - 创建没有重复的随机数

转载 作者:IT老高 更新时间:2023-10-28 11:42:13 25 4
gpt4 key购买 nike

在这种情况下,MAX 只有 5,所以我可以一个一个地检查重复项,但我怎样才能以更简单的方式做到这一点?例如,如果 MAX 的值为 20,该怎么办?谢谢。

int MAX = 5;

for (i = 1 , i <= MAX; i++)
{
drawNum[1] = (int)(Math.random()*MAX)+1;

while (drawNum[2] == drawNum[1])
{
drawNum[2] = (int)(Math.random()*MAX)+1;
}
while ((drawNum[3] == drawNum[1]) || (drawNum[3] == drawNum[2]) )
{
drawNum[3] = (int)(Math.random()*MAX)+1;
}
while ((drawNum[4] == drawNum[1]) || (drawNum[4] == drawNum[2]) || (drawNum[4] == drawNum[3]) )
{
drawNum[4] = (int)(Math.random()*MAX)+1;
}
while ((drawNum[5] == drawNum[1]) ||
(drawNum[5] == drawNum[2]) ||
(drawNum[5] == drawNum[3]) ||
(drawNum[5] == drawNum[4]) )
{
drawNum[5] = (int)(Math.random()*MAX)+1;
}

}

最佳答案

最简单的方法是创建一个可能的数字列表(1..20 或其他),然后使用 Collections.shuffle 将它们随机排列。然后随便取多少你想要的元素。如果你的范围等于你最终需要的元素数量(例如洗一副牌),那就太好了。

如果你想要(比如说)1..10,000 范围内的 10 个随机元素,那效果就不太好了——你最终会做很多不必要的工作。到那时,最好保留到目前为止生成的一组值,并在循环中不断生成数字,直到下一个数字不存在:

if (max < numbersNeeded)
{
throw new IllegalArgumentException("Can't ask for more numbers than are available");
}
Random rng = new Random(); // Ideally just create one instance globally
// Note: use LinkedHashSet to maintain insertion order
Set<Integer> generated = new LinkedHashSet<Integer>();
while (generated.size() < numbersNeeded)
{
Integer next = rng.nextInt(max) + 1;
// As we're adding to a set, this will automatically do a containment check
generated.add(next);
}

但请注意集合的选择 - 我特意使用了 LinkedHashSet,因为它维护插入顺序,我们在这里关心这一点。

另一种选择是总是取得进展,每次缩小范围并补偿现有值。例如,假设您想要 0..9 范围内的 3 个值。在第一次迭代中,您将生成 0..9 范围内的任何数字 - 假设您生成 4。

在第二次迭代中,您将生成一个 0..8 范围内的数字。如果生成的数字小于 4,你会保持原样......否则你添加一个。这样得到的结果范围是 0..9 而没有 4。假设我们这样得到 7。

在第三次迭代中,您将生成一个 0..7 范围内的数字。如果生成的数字小于 4,则保持原样。如果是 4 或 5,你会加一个。如果是 6 或 7,您将添加两个。这样,结果范围是 0..9,没有 4 或 6。

关于java - 创建没有重复的随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4040001/

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