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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:37:03