You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

生成指定长度无重复随机数数组时的循环问题求助

解决无重复随机数数组生成的问题

嘿,我懂你现在的困扰——你想生成一个包含10个无重复随机数的数组,但当前代码只输出了6个元素,而且尝试在随机数重复时递减i的方法也没起作用。这其实是因为你大概率用了for-in循环,这种循环里的i是由系统自动迭代的,你手动修改i的值不会影响下一次循环的迭代逻辑,所以才会凑不够目标数量。

下面给你几种靠谱的解决方案,你可以根据自己的需求选:

方法一:用Set自动去重(最省心)

Set本身就不允许重复元素,我们可以利用这一点,循环生成随机数直到Set的大小达到目标数量,最后转成数组就行:

let numberOfAnimals = 10
var uniqueNumbers = Set<Int>()
// 这里的随机数范围可以根据你的需求调整,比如0到20就写0..<21
while uniqueNumbers.count < numberOfAnimals {
    let randomNum = Int.random(in: 0..<10)
    uniqueNumbers.insert(randomNum)
}
// 将Set转换为数组
let resultArray = Array(uniqueNumbers)
print(resultArray)

这种方法不需要手动判断重复,Set会帮你处理,逻辑简单不容易出错。

方法二:洗牌预先生成的数组(高效适配连续范围)

如果你的随机数范围刚好是0到numberOfAnimals-1(比如要生成0-9的不重复随机数),那直接生成有序数组再洗牌是最高效的方式:

let numberOfAnimals = 10
// 生成0到9的有序数组
var resultArray = Array(0..<numberOfAnimals)
// 打乱数组顺序
resultArray.shuffle()
print(resultArray)

这种方式避免了重复生成随机数和判断的开销,性能更好。

方法三:用While循环手动控制数组长度(贴近你的原始思路)

如果你想沿用“生成-判断-添加”的思路,改用While循环来控制数组的最终长度就可以了:

let numberOfAnimals = 10
var uniqueNumbers = [Int]()
while uniqueNumbers.count < numberOfAnimals {
    let randomNum = Int.random(in: 0..<10)
    // 检查随机数是否已存在,不存在就添加
    if !uniqueNumbers.contains(randomNum) {
        uniqueNumbers.append(randomNum)
    }
}
print(uniqueNumbers)

这种方式会一直循环,直到数组里的元素数量达到10,完全不用担心数量不够的问题。

为什么你原来的方法无效?

如果你的原始代码是类似这样的for-in循环:

let numberOfAnimals = 10
var uniqueNumbers = [Int]()
for i in 0..<numberOfAnimals {
    let randomNum = Int.random(in: 0..<10)
    if uniqueNumbers.contains(randomNum) {
        i -= 1 // 这里的修改不会影响循环的迭代
        continue
    }
    uniqueNumbers.append(randomNum)
}

那问题就出在for-in循环的迭代逻辑上:循环的i是由系统每次自动赋值的,你在循环里修改i的值,下一次循环i还是会按照原来的序列递增,所以这个递减操作完全起不到“让循环多执行一次”的作用,自然凑不够10个元素。

内容的提问来源于stack exchange,提问作者Dorukk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:36:29