2016-11-01 9 views
-1

私は迅速に構築しようとしているアプリケーションの配列をランダム化し、私が作成した関数をテストするために、サンプル配列を使ってそれをプレイグラウンドに配置する必要があります。私はこの質問がここで尋ねられたことを認識しています:How do I shuffle an array in Swift? しかし、私はこの特定の方法がなぜ機能していないのだろうと思っていました。ここに私のコードです:配列を無作為化する

私は配列1を使用して関数を印刷しようとすると、「致命的なエラー:インデックスが範囲外です」と表示されます。何が起こったのか?

+2

5つの要素を持つ配列の場合、問題を簡単に*デバッグできます。 Xcodeでコードをシングルステップ実行すると、問題のある箇所がすぐにわかります。 –

+2

そして、不要な型の注釈を取り除いてください。 –

答えて

0

When I try to print the function using array one, it says "Fatal error: index is out of range." Any ideas why this happened?

第三に、あなたはこれを試して予測不可能な方法

に配列し、copyOfArrayの使用を組み合わせることです。

プロパティarrayCount(つまりarray.count)はループ内で固定されています。つまり、例では4に固定されています。つまり、ループは終了しません(array.count > 0常にtrue)。さらに、この数値を乱数生成の上限として使用するので、3の値を得ることができます。短い分析で、の値は常に3であると仮定します(そして、randomIndexはより適切な名前になります)。

初期サイズcopyOfArray5であり、インデックスアクセスは最大でcopyOfArray[4]です。 2回の反復の後に、copyOfArrayのサイズは(copyOfArray.remove(at: randomElement)での要素の除去に起因して)3であり、これは、この時点で、copyOfArray[3]が範囲外のインデックスにアクセスしようとしていることを意味する。別の反復では、さらにcopyOfArray[2]が範囲外です。ループは決して終了しないので、copyOfArrayが小さくなる(空の配列に向かって、[])ので、0...3の範囲のインデックスを削除しようとし続けるので、インデックスの範囲外実行時例外によってクラッシュすると考えられます。

Declaration

mutating func remove(at index: Int) -> Element 

Parameters

index 

The position of the element to remove. indexmust be a valid index of the array.

1

いくつかの問題があるようです。

まず、通常はリピート中から離れることをお勧めします。そのパラダイムは、単純なwhileループよりもはるかに混乱します。

第2に、ランダマイザは配列の最後の項目を省略しています。私はこの質問にお答えします

var arrayOne : [String] = ["", "", "", "", ""] 

func randomizeArray(array : [String]) -> [String] { 
    var randomizedArray : [String] = [] 
    var copyOfArray : [String] = array 
    while !copyOfArray.isEmpty { 
     let arrayCount : Int = copyOfArray.count 
     let randomElement : Int = Int(arc4random_uniform(UInt32(arrayCount))) 
     let arraySlice : String = copyOfArray[randomElement] 
     randomizedArray.append(arraySlice) 
     copyOfArray.remove(at : randomElement) 
    } 
    return randomizedArray 
} 



print(randomizeArray(array : arrayOne)) 
+0

それはうまくいきました。私は乱数を計算し続ける必要があるので、それを行う方法よりも遅くなるかもしれませんが、私のような初心者の立場から理解する方が簡単です。 –

+0

元の配列のアイテムを交換するのではなく、新しい配列を作成するため、処理が遅くなります。 – PeejWeej

関連する問題