2016-09-23 7 views
0

ランダム配列要素を新しい配列に追加しようとすると、「スレッド1:EXC_BAD_INSTRUCTION(コード= EXC_1386_INVOP、サブコード= 0x0)」が表示されます。乱数を生成する作業を行うSwift:ランダム配列要素を追加しようとするとEXC_BAD_INSTRUCTIONを取得する

//If there are more than 6 players prioritizing the event, make a random choice. garudaLocations is an array containing the players who prioritized the event "Garuda". 

    if garudaLocations.count > 6 { 

     var finalGarudaPlayers : [Int] = [] 
     let getRandom = randomSequenceGenerator(1, max: garudaLocations.count) //Tell RNG how many numbers it has to pick from. 
     var randomGarudaPrioritiesIndex = Int() 
     for _ in 1...6 { 
      randomGarudaPrioritiesIndex = getRandom() //Generate a random number. 
      finalGarudaPlayers.append(garudaLocations[randomGarudaPrioritiesIndex]) //ERROR: Thread 1: EXC_BAD_INSTRUCTION(code=EXC_1386_INVOP, subcode=0x0) 
     } 
     debugPrint(finalGarudaPlayers) //Print array with the final priority Garuda members. 

randomSequenceGenerator is a function I got from here:「範囲外のインデックス致命的なエラー」、

デバッグログは述べています。

func randomSequenceGenerator(min: Int, max: Int) ->() -> Int { 
    var numbers: [Int] = [] 
    return { 
     if numbers.count == 0 { 
      numbers = Array(min ... max) 
     } 

     let index = Int(arc4random_uniform(UInt32(numbers.count))) 
     return numbers.removeAtIndex(index) 
    } 
} 

より良い理解を得るために、私は選手たちが自動的にイベントに分類されている「チーム作り」プログラムの一部を記述しようとしていますが、彼らは、彼らが優先順位付けしたいどのイベントを選択することができます。

私は唯一のイベントごとに6人を持つことができる、しかし、そう目標は、既存のgarudaLocations配列を取るランダム6つのインデックスの場所を選択し、選手たちの残りの部分を取り除くことです。

私は同じイベントに6人以上のプレーヤーを提出した後でエラーが発生します。

ご協力いただきありがとうございます。

答えて

1

はありません。は存在しないインデックスについて語ります。あなたがそうした場合、あなたは今クラッシュしているようにクラッシュします。

だから、あなたが言っている:

garudaLocations[randomGarudaPrioritiesIndex] 

今、私はgarudaLocationsが何であるかを知りません。しかし、もしあなたがrandomGarudaPrioritiesIndexgarudaLocationsの既存のインデックスでないなら、あなたは絶対にクラッシュすることをあなたに伝えることができます。

したがって、(printrandomGarudaPrioritiesIndexをログに記録することで簡単にデバッグできます。

既存のインデックスの中で最大のものがgarudaLocations[garudaLocations.count]ではないことに注意してください。それはgarudaLocations[garudaLocations.count-1]です。したがって、randomGarudaPrioritiesIndexgarudaLocations.count-1と比較してください。それが大きい場合は、garudaLocationsのインデックスとして使用するとクラッシュします。

+0

garudaLocationsは、優先度としてイベントを選択したプレイヤーを含む配列です。 randomGarudaPrioritiesIndexは、乱数を保持する変数(randomSequenceGenerator関数で生成)を意味します。 通常、*特定の* Index要素をリストするには、(array [X])を使用して、配列内の要素Xをリストします。私は、乱数ジェネレータを0の代わりに使用して、* random *配列要素を見つけることができると考えました。そうじゃないの? –

+0

と私はdebugPrint(randomGarudaPrioritiesIndex)ときに(配列ではない)期待どおり6ランダム整数を取得します。 –

+0

それはすべて素晴らしいです。しかし、それは無関係です。その疑問は、これらの乱数のいずれかが 'garudaLocations [randomGarudaPrioritiesIndex]'の式で使用するのに合法であるかどうかです。明らかに、時にはそうではない。 – matt