3

ランダムな順序で文字列を含む配列を生成しようとしましたが、関数 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
}    
}
4

2 に答える 2

3

コード形成のためにここに提示された答えではありません:

これは、遊び場とアプリの両方で機能します。

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

cardOrder = randomPile(cardOrder)
println(cardOrder)

おそらくエラーは別の場所にあります。

注:var r = Int(arc4random_uniform(UInt32(i+1)))はより単純であり、バイアスを回避します。

于 2014-07-01T02:07:46.950 に答える
1

また、私はプレイグラウンドでも実行できるため、問題がどこにあるのかわかりません。ただし、配列への新しい参照を作成して返す必要はありません。また、上限を除外する整数 PRNG を対象とする Fisher-Yates シャッフル バリアントも実装しました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]
于 2014-07-01T02:40:34.180 に答える