2015-12-25 221 views
2

我在最近的一个快速程序中遇到了这个奇怪的错误。它涉及随机事件,并且为了模拟这个我分配一个事件'赔率',然后生成两个随机数(使用这些赔率),如果数字相同,那么动作发生。但是这个程序莫名其妙地在代中崩溃。我能想到的唯一解释是所需的铸造过多,但我不确定为什么它偶尔会崩溃。我很感激任何洞察力,为什么该演员崩溃,并且为了避免这种过度投射而采取什么措施。
我的图像显示代码和错误,下面的代码是我的代码的一般化。 Crash ErrorSwift casting导致应用程序崩溃

let rand = [Int(arc4random_uniform(UInt32(someInt))), Int(arc4random_uniform(UInt32(someInt)))] 
if (rand[0] == rand[1]) { 
    executeAction() 
} 
+0

只是澄清,arc4random_uniform需要UInt32并返回UInt32。我someInt是一个数字整数。 – Sllew

+0

这不是为我崩溃,someInt包含什么? –

+0

数量呈指数级增长,显然。在某些情况下,我把赔率加倍(从3到6)......但是因为赔率是全球性的,他们保持了增长并保持翻倍。我猜测UInt32最大并抛出错误。感谢您的帮助! – Sllew

回答

1

这是因为你的整数变量shootOdds,在某些时候,取负值(或:不太可信,比4,294,967,295大的值),从而导致运行错误流延到无符号整数,UInt32(someInt)。通过在let rand = ...行之前确保shootOdds >= 0(或在上面的代码示例中,someInt >= 0)或您的编号不大于UInt32的上限,可以避免此问题。

因此请注意,错误不是与rand函数关联的,而是特别是将负整数转换为无符号整数。

比如,试试下面的例子在操场上,断言你会得到相同的运行时错误:

let a = -1 
let b = UInt32(a) 
+0

感谢您的帮助!事实证明,这个数字太大,不是负面的。我有一些不好的代码,它们的指数增加的几率直到它们大于32位。 – Sllew

+0

赫我猜测考虑过大,但认为负面更合理。我会编辑答案,使其详尽无遗。 – dfri

+0

游乐场的想法非常好,我本来应该把它摆在首位。使用它,我认为在20倍到25倍的迭代UInt32会崩溃。这解释了为什么它只会在一段时间后才会发生。 – Sllew

0

由于错误的代码,我的胜算都被包含在UInt32的成倍并最终太大增加。因此错误。谢谢您的帮助!