我最近在我的一个快速计划中遇到了这个奇怪的错误。它涉及随机事件,并且为了模拟这个我分配一个事件'赔率',然后生成两个随机数(使用这些赔率),如果数字相同则行动发生。但是程序在生成部分中无法解释地崩溃了。我能想到的唯一解释是需要过多的铸造,但我不确定为什么它只会偶尔崩溃一次。我很欣赏任何关于为什么铸件崩溃以及为避免这种过度铸造应采取什么措施的建议。
我的图像显示了代码和错误,下面的代码是我的代码的概括。
Crash Error
let rand = [Int(arc4random_uniform(UInt32(someInt))), Int(arc4random_uniform(UInt32(someInt)))]
if (rand[0] == rand[1]) {
executeAction()
}
答案 0 :(得分:1)
这是因为您的整数变量shootOdds
在某个时刻取负值(或者:不太合理,值大于4,294,967,295
),导致转换为无符号整数的运行时错误,{ {1}}。您可以在UInt32(someInt)
行之前确定let rand = ...
(或上面的代码示例中为shootOdds >= 0
),或者您的数字不大于上限,从而避免这种情况someInt >= 0
。
因此请注意,错误与rand函数无关,但具体而言是负整数转换为无符号整数。
例如,在你的操场上尝试以下示例,断言你得到相同的运行时错误:
UInt32
答案 1 :(得分:0)
由于代码错误,我的几率呈指数增长,最终太大而无法包含在UInt32中......因而错误。谢谢你的帮助!