2015-12-25 249 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的成倍並最終太大增加。因此錯誤。謝謝您的幫助!