You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用arc4random_uniform生成随机数存数组时遇索引越界问题求助

Swift生成指定范围随机数到数组的问题修复

嘿,咱们一步步来拆解并解决你遇到的两个问题:

1. 关于第一个类型转换错误

你一开始碰到的 Cannot convert value of type 'Int' to expected argument type 'UInt32' 报错,原因很直接:arc4random_uniform(_:) 函数要求传入的参数必须是 UInt32 类型,但你最初传的 limInt 类型。所以你后来把 lim 转成 UInt32 的修改是完全正确的,这部分你已经搞定啦。

2. 重点解决运行时的数组越界错误

你修改类型后出现的 Fatal error: Index out of range,核心问题出在数组的初始化和赋值逻辑上:

  • 你初始化的 results 是一个空数组var results = [Int](),此时它的元素个数为0,根本不存在 results[0]results[1] 这类索引对应的位置。
  • 直接用 results[i] = ... 去赋值,相当于要访问数组里不存在的位置,自然就触发了越界错误。

两种可行的修复方案:

方案一:用append方法动态添加元素

直接把赋值操作改成追加元素,数组会自动扩容来容纳新元素:

var results = [Int]()
for _ in 0...qut { // 这里i没被用到,可以换成下划线省略
    let lim = limit - 1
    let randomNum = Int(arc4random_uniform(UInt32(lim))) + 1
    results.append(randomNum)
}

方案二:先初始化固定容量的数组

如果你提前知道要生成的元素数量(0...qut 是闭区间,一共 qut+1 个元素),可以先创建对应大小的数组,再逐个赋值:

// 先创建包含qut+1个默认值的数组,用0占位即可
var results = Array(repeating: 0, count: qut + 1)
for i in 0...qut {
    let lim = limit - 1
    results[i] = Int(arc4random_uniform(UInt32(lim))) + 1
}

另外小提醒:要确保 limit 的值大于1哦,不然 lim = limit - 1 会变成0,arc4random_uniform(0) 会固定返回0,加1后总是1,就失去随机数的意义啦。

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

火山引擎 最新活动