使用arc4random_uniform生成随机数存数组时遇索引越界问题求助
Swift生成指定范围随机数到数组的问题修复
嘿,咱们一步步来拆解并解决你遇到的两个问题:
1. 关于第一个类型转换错误
你一开始碰到的 Cannot convert value of type 'Int' to expected argument type 'UInt32' 报错,原因很直接:arc4random_uniform(_:) 函数要求传入的参数必须是 UInt32 类型,但你最初传的 lim 是 Int 类型。所以你后来把 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




