2016-08-14 8 views
0

どんな助けもするだろう。おかげさまで c#を使用して繰り返しを使わずにシーンを無作為に読み込みます。#

int[] array = new int[] { 1, 2, 3, 4, 6, 8, 9, 10, 11, 12 }; 
List<int> list = new List<int>(); 

void Start() 
{ 
    list.AddRange(array); 
} 

int GetUniqueRandom(bool RemoveFromTheList) 
{ 
    if (list.Count == 0) 
    { 
     if (RemoveFromTheList) 
     { 
      list.AddRange(array); 
     } 
     else 
     { 
      return -1; // never repeat 
     } 
    } 

    int rand = Random.Range(0, 10); 
    int value = list[rand]; 
    list.RemoveAt(rand); return value; 
} 
+0

これは私のコードです\ –

+0

あなたはコードを投稿していません。 – SurvivalMachine

+0

int [] array = new int [] {1,2,3,4,6,8,9,10,11,12}; リストリスト=新しいリスト(); void Start() { list.AddRange(array); } INT GetUniqueRandom(ブールRemoveFromTheList) {IF(list.Count == 0){ IF(RemoveFromTheList) {list.AddRange(アレイ) } else { return -1; // never never repeat } } int rand = Random.Range(0、10); int値=リスト[rand]; list.RemoveAt(rand); 戻り値。 } –

答えて

1

素敵なきれいな方法は、スタック内のすべての要素を入れた後、配列をシャッフルすることです。ランダム要素を得るために必要なことは、アイテムをスタックからポップすることだけです。

フィールドのリストでリストを削除してこれに置き換えることをお勧めします。

Stack remainingScenes = new Stack(); 

Start()メソッドの内容を削除する必要はありません。

新しい番号を取得する方法では、

if (remainingScenes.Count == 0) { 
    int n = array.Length; 
     while (n > 1) 
     { 
      int k = rng.Next(n--); 
      T temp = array[n]; 
      array[n] = array[k]; 
      array[k] = temp; 
     } 

     foreach(var element in array) { 
      remainingScenes.Push(element); 
     } 
} 

return remainingScenes.Pop(); 

シャッフル方法は、from hereです。

+0

はまだ動作しません。シーンがすべてロードされるまで繰り返さずに、ランダムなシーンに簡単な方法がありますか? array not listを使用します。 –

+0

私は少し明確に答えを書き直しました。 –

+0

まだまだ待っています –

0

ええと、これは非常に簡単です。あなたのコードから判断すると、あなただけのそれを動作させるには少し修正が必要..

List<int> list = new List<int>() { 1, 2, 3, 4, 6, 8, 9, 10, 11, 12 }; 

int GetUniqueRandom(bool RemoveFromTheList) 
{ 
    if (list.Count == 0) 
    { 
     return -1;//nothing in the list so return negative value 
    } 
    //generate random index from list 
    int randIndex = Random.Range(0, list.Count - 1); 
    int value = list[rand]; 
    if(RemoveFromTheList) 
    { 
     list.RemoveAt(randIndex); 
    } 
    return value; 
} 
+0

どこにこのスクリプトを添付しますか? –

0

はこれを試してみてください:

int[] array = new int[] { 1, 2, 3, 4, 6, 8, 9, 10, 11, 12 }; 
Stack<int> stack = null; 

次に、このように初期化します。

var rnd = new Random(); 
stack = new Stack<int>(array.OrderBy(x => rnd.Next())); 

を今、あなたはちょうど保ちますスタックから空になるまで値を取得する:

var value = stack.Pop(); 
関連する問題