【发布时间】:2014-08-21 11:41:58
【问题描述】:
我尝试使用随机顺序的字符串生成一个数组,但在函数 randomPile 的末尾总是出现错误“Thread1:EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)”。以下是我的代码:
import UIKit
class RandomView: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
var cardOrder = ["HeartSix","HeartNine", "ClubQueen", "SpadeKing" ]
// cannot randomlize due to the lanuage drawbacks.
cardOrder = randomPile(cardOrder)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
// random the order of the original card pile
func randomPile(arrayPile: String[]) -> String[] {
var arry = arrayPile
for( var i = arry.count-1; i > 0; --i){
var r = Int(arc4random())%(i+1)
var a = arry[r]
arry[r] = arry[i]
arry[i] = a
}
return arry
}
}
【问题讨论】:
-
你应该使用
arc4random_uniform(i+1)来避免模偏差。 -
试过,但 arc4random_uniform(i+1) 也有错误:“找不到接受提供的参数的 '+' 的重载”。
-
抱歉,忘了说您需要将参数转换为
UInt32。 -
你的问题是 arc4random() 返回 UInt32。在 32 位目标 上——比如 iPhone 4S 模拟器——你将试图将结果填充到一个 有符号 32 位整数中,从而导致崩溃,有时。它可以在游乐场(几乎可以肯定是 64 位)或 64 位模拟器或设备上工作。见stackoverflow.com/questions/24087518/…
-
@MattGibson 所以使用带有 31 位或更少参数的
arc4random_uniform()应该安全地转换为Int?除了模偏差问题之外,还有另一个使用它的原因。
标签: xcode swift exc-bad-instruction