Swift实现指定范围的不重复随机整数列表生成函数
实现无重复随机整数列表的Swift函数
嘿,我来帮你搞定这个生成无重复随机整数的Swift函数!先聊聊你原来代码里的几个小问题:
- 生成随机数时用了
listSize作为范围上限,这和参数里的maxNumber完全没关联,不符合“随机数最大值由用户指定”的要求; - 没有处理重复问题,直接循环append会导致列表里出现重复的整数,达不到“不可重复”的核心要求;
- 缺少参数合法性校验,比如用户传入
listSize大于maxNumber的话,根本不可能生成无重复的列表,这时候得做容错处理。
下面给你两种靠谱的实现方案,你可以根据场景选:
方案一:用Set保证唯一性(适合listSize远小于maxNumber的场景)
这种方法利用Set自动去重的特性,循环生成随机数直到Set的大小达到要求,最后转成数组返回:
func getRandomNumbers(maxNumber: Int, listSize: Int) -> [Int] { // 先做参数合法性校验,避免非法输入导致的逻辑错误 guard listSize > 0, maxNumber >= listSize else { print("参数异常:listSize必须大于0,且maxNumber不能小于listSize哦") return [] } var randomSet = Set<Int>() while randomSet.count < listSize { // 生成1到maxNumber之间的随机整数(如果需要0到maxNumber-1,去掉末尾的+1即可) let randomNum = Int(arc4random_uniform(UInt32(maxNumber))) + 1 randomSet.insert(randomNum) } return Array(randomSet) }
方案二:洗牌法(适合listSize接近maxNumber的场景)
如果需要的列表长度和maxNumber差不多,用洗牌法效率更高——先创建一个包含1到maxNumber的完整数组,打乱顺序后取前listSize个元素,完全不会有重复:
func getRandomNumbers(maxNumber: Int, listSize: Int) -> [Int] { guard listSize > 0, maxNumber >= listSize else { print("参数异常:listSize必须大于0,且maxNumber不能小于listSize哦") return [] } // 创建从1到maxNumber的有序数组 let fullNumberArray = Array(1...maxNumber) // 打乱数组顺序 let shuffledArray = fullNumberArray.shuffled() // 截取前listSize个元素返回 return Array(shuffledArray.prefix(listSize)) }
两种方案都加了参数校验,能避免用户传入不合理参数时出现逻辑崩溃,你可以根据自己的实际使用场景选择~
内容的提问来源于stack exchange,提问作者Kazi Abdullah Al Mamun
相关产品推荐
相关产品推荐

