2016-10-04 12 views
-1

私はこのコードを使用して、1000000の数字を重複なくランダム化しています。ここに私がこれまで持っているものがあります。効率的な方法で重複のない数字をランダム化

enter code here protected void randomise() { 
    int[] copy = new int[getArray().length]; 
    // used to indicate if elements have been used 
    boolean[] used = new boolean[getArray().length]; 
    Arrays.fill(used,false); 
    for (int index = 0; index < getArray().length; index++) { 
     int randomIndex; 
     do { 
      randomIndex = getRandomIndex(); 
     } while (used[randomIndex]); 
     copy[index] = getArray()[randomIndex]; 
     used[randomIndex] = true; 
    } 
    for (int index = 0; index < getArray().length; index++) { 
     getArray()[index] = copy[index]; 
     //Checks if elements in array have already been used 
    } 
} 

public static void main(String[] args) { 
    RandomListing count = new SimpleRandomListing(1000000); 
    //Will choose 1000000 random numbers 
    System.out.println(Arrays.toString(count.getArray())); 
} 

この方法は遅すぎます。これがより効率的にどのように行われるか教えてください。私はすべての返答を感謝します。 よろしくお願いします。

+0

どのような種類の乱数が欲しいですか? 0と1000000の間の数字だけ? –

+0

重複なしでより効率的に –

+2

1M要素の配列を作成し、カードをシャッフルしているかのように、要素をちょっとシャッフルします(つまり、2つの乱数を選んで値をシフトします...繰り返しX回数) –

答えて

0

これを行うより効率的な方法は、数字のプール(例:List 0から1000000までの数字のすべて)から始め、既に使用した数字を削除することです。そうすることで、新しい番号を取得しようとするたびに、その番号は未使用の「良い」番号を見つけるために時間を費やすのではなく、以前に使用されたことがないことが保証されます。

0

リニア検索を使って一致するものが見つかったようです。より効率的なバイナリ検索をお試しください。バイナリ検索を実装するには、検索する配列をソートする必要があります。

関連する問題