Xcode swift语言中的随机数生成问题-EXC_BAD_指令

Xcode swift语言中的随机数生成问题-EXC_BAD_指令,xcode,swift,exc-bad-instruction,Xcode,Swift,Exc Bad Instruction,我试图以随机顺序生成包含字符串的数组,但在函数randomPile的末尾总是出现错误“Thread1:EXC_BAD_指令(code=EXC_I386_INVOP,subcode=0x0)”。下面是我的代码: import UIKit class RandomView: UIViewController { override func viewDidLoad() { super.viewDidLoad() var cardOrder = ["HeartSix","Heart

我试图以随机顺序生成包含字符串的数组,但在函数randomPile的末尾总是出现错误“Thread1:EXC_BAD_指令(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
}    
}

不是答案,此处提供代码形成:

这在运动场和应用程序中都适用:

var cardOrder: String[] = ["HeartSix","HeartNine", "ClubQueen", "SpadeKing" ]
println(cardOrder)

cardOrder = randomPile(cardOrder)
println(cardOrder)
也许错误在别处


注意:
var r=Int(arc4random_uniform(UInt32(i+1))
既简单又避免了偏见。

也不是答案,因为我也可以在操场上跑步,所以我不知道你的问题出在哪里。但是,不需要创建对数组的新引用并返回它。我还实现了一个Fisher-Yates shuffle变体,它面向一个不包含其上限的整数PRNG,正如
arc4random_uniform
所做的那样:

func randomPile(myArray: String[]) -> Void {
    for i in 0..(myArray.count - 1) {
        let j = Int(arc4random_uniform(UInt32(myArray.count - i))) + i
        let tmp = myArray[i]
        myArray[i] = myArray[j]
        myArray[j] = tmp
    }
}

let cardOrder: String[] = ["HeartSix","HeartNine", "ClubQueen", "SpadeKing" ]
println(cardOrder)
randomPile(cardOrder)
println(cardOrder)
在数组中调用此命令后,它将被洗牌,无需重新分配到
cardOrder

附录-我刚刚检查过,由于
cardOrder
不会再次出现在作业左侧,因此可以使用
let
声明

您还可以将洗牌功能设置为通用功能,为什么不呢

func shuffle<T>(myArray: T[]) -> Void {
    for i in 0..(myArray.count - 1) {
        let j = Int(arc4random_uniform(UInt32(myArray.count - i))) + i
        let tmp:T = myArray[i]
        myArray[i] = myArray[j]
        myArray[j] = tmp
    }
}

let cardOrder: String[] = ["HeartSix","HeartNine", "ClubQueen", "SpadeKing"]
println(cardOrder)  // [HeartSix, HeartNine, ClubQueen, SpadeKing]
shuffle(cardOrder)
println(cardOrder)  // sample result: [SpadeKing, HeartNine, HeartSix, ClubQueen]
let intValues = [1,2,3,4,5,6,7,8,9,10]
println(intValues)  // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
shuffle(intValues)
println(intValues)  // sample result: [3, 10, 8, 4, 9, 7, 1, 2, 5, 6]
func shuffle(myArray:T[])->Void{
对于0中的i..(myArray.count-1){
设j=Int(arc4random_-uniform(UInt32(myArray.count-i))+i
设tmp:T=myArray[i]
myArray[i]=myArray[j]
myArray[j]=tmp
}
}
let cardOrder:String[]=[“HeartSix”、“HeartNine”、“ClubQueen”、“SpadeKing”]
println(cardOrder)/[HeartSix,HeartNine,ClubQueen,SpadeKing]
洗牌(卡片订购)
println(cardOrder)//示例结果:[SpadeKing、HeartNine、HeartSix、ClubQueen]
设intValues=[1,2,3,4,5,6,7,8,9,10]
println(intValues)/[1,2,3,4,5,6,7,8,9,10]
洗牌(intValues)
println(intValues)//示例结果:[3,10,8,4,9,7,1,2,5,6]

您应该使用
arc4random_uniform(i+1)
来避免模偏差。尝试过了,但是arc4random_uniform(i+1)也有一个错误:“找不到接受提供的参数的“+”的重载”。很抱歉,忘了提到您需要将参数强制转换为
UInt32
。您的问题是arc4random()返回UInt32。在一个32位的目标上——比如说一个iPhone4S模拟器——你会试图将结果填充到一个有符号的32位整数中,有时会导致崩溃。它可以在操场上工作(几乎可以肯定是64位的),也可以在64位模拟器或设备上工作。请参阅@MattGibson,因此使用带有31位或更少参数的
arc4random_uniform()
应安全地强制转换为
Int
?除了模偏差问题之外,使用它还有另一个原因。这个函数在操场上也适用,而且是我第一次使用这个UIViewController。但当我再次运行它时,错误就会出现,并且每次它都出现在循环的不同周期中。对于实验,我只构建了这个UIViewController,连接到情节提要中的空白控制器。另外,你的便条也为我生成了一个错误,显示“找不到接受所提供参数的“+”的重载”,甚至我也为它添加了空间。你一定会喜欢斯威夫特的所有痛苦——好吧,我不喜欢。(确保使用当前的arc4random_统一示例,我修复了错误,非常糟糕的错误消息,嗯?)您的答案中还有一个问题:为什么不需要创建新引用?swift如何知道该函数是否用于设置或获取输入?在我的原始代码中,引用carOrder是在func viewDidLoad()中声明的;它是本地的。您正在传递数组引用作为参数,而不是数组的副本。基于该引用的索引的操作操作操作原始数组的内容,就像在C或Objective-C中一样。哇,我们正在恢复为通过引用返回。多年来,我们一直在努力摆脱这个概念。@Zaph看起来更像Java的对象引用,而不是C/C++/Objective-C指针。它们可以是左值,您可以使用
[]
进行偏移访问,但它是边界检查的。我还没有找到一种方法来做其他算术。相当温和,并且可以节省大量数据的复制。