生成指定长度无重复随机数数组时的循环问题求助
解决无重复随机数数组生成的问题
嘿,我懂你现在的困扰——你想生成一个包含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
相关产品推荐
相关产品推荐

