2016-11-09 13 views
0

数字の配列を持つランダムジェネレータでインデックスをランダムに選びます。既に選択されているインデックスで無駄なループを回避するためのランダムジェネレータのベストプラクティスは何ですか?これまではArrayListを使って既に選択されているものを格納していましたが、最終的にこのアルゴリズムは多くの無駄なループを最終的には感じます。コードは次のとおりです。ランダムジェネレータのベストプラクティスJava

Random r = new Random(); 
ArrayList<Integer> found = new ArrayList<Integer>(); 
while(notAllPassed){ 
    int prediction = r.nextInt(sizeOfArray); 
    if(!found.contains(prediction){ 
     found.Add(prediction); 
     //Do stuff 
    } 
} 
+6

1.インデックスのリストを作成します。リストをシャッフルします。 –

+0

@MarkoTopolnikが何を言ったのかを少し詳しく説明します(それが明らかでない場合に備えて)。シャッフルアルゴリズムを検索します。 – markbernard

+1

@markbernard必要はありません。 'Collections.shuffle()' –

答えて

4

アイデアは、毎回ランダムなインデックスを選択するのではなく、すべてのインデックスのシャッフルリストを準備し、それを順番に反復するという考え方です。

List<Integer> indices = IntStream.range(0, sizeOfArray).boxed().collect(toList()); 
Collections.shuffle(indices); 
for (int randomIndex : indices) { 
    // do your thing 
} 
3

すでに生成されているかどうかを確認する代わりに、別の方法でアプローチします。可能なすべての値の配列を作成し、配列をランダムにシャッフルします。あなたが最初のリストについては、組み込みの方法java.util.Collection.shuffle(List)

を利用することができ

、順序は重要ではありませんが、それだけで0..N-1または1..nの値を次々とそれを埋めるのが最も簡単です別のシャッフルが完全に無作為であるため、より複雑な方法で行うのは一切役に立たない。

0

マルコTopolnikanswerとabsolutly権利です。それはそれを行うための最善の方法です。

だから、私の答えは、私が言ったように、これは単にランダムに使用するためにあなたの最初のアイデアを以下れるRandom

Random r = new Random();      // as you had it 
    ArrayList<Integer> found = new ArrayList<>(); // as you had it 

    for(int i = 0; i < sizeOfArray; i++){   // if you want ALL possible indexes 
     int prediction = r.nextInt(sizeOfArray); // exactly as you did it 
     while(found.contains(prediction)){  // here we check if the "found" list already contains the random index 
      prediction = r.nextInt(sizeOfArray); // if so, regenerate the "prediction" until one is generated that is not in the list 
     } 
     found.add(prediction);     // this statement will only be reached after the while loop found an index that is not in the list 
    } 

    System.out.println(found.toString());   // convenience: print the list to see for yourself 

であなたの最初のアイデア以下、単に完了のためです。 Collection.shuffle()がない場合、私はこのようにしたでしょう:)

関連する問題