2011-12-07 6 views
9

誰かが一度に配列からいくつかの異なる乱数をどのように選ぶことができますか? たとえば、long int配列があります。私はそれから7つの数字を選びたいと思う。すべての数字は同じであってはなりません。Java:一度に配列からいくつかの異なる乱数を選択

Random random = new Random(); 
int a = mixColor[random.nextInt(mixColor.length)]; 
int b = mixCoor[random.nextInt(mixCoor.length)]; 
int c = mixCoor[random.nextInt(mixCoor.length)]; 
int d = mixCoor[random.nextInt(mixCoor.length)]; 
int e = mixCoor[random.nextInt(mixCoor.length)]; 
while(b!=c && c!=d && b!=d) { 
    b = mixCoor[random.nextInt(mixCoor.length)]; 
    c = mixCoor[random.nextInt(mixCoor.length)]; 
    d = mixCoor[random.nextInt(mixCoor.length)]; 
} 

mixColor[]mixCoor[]はlong intの配列です。私はこのようにすることができますが、もし私がより多くの数字を選びたいなら、これは本当に複雑になります。私もそれらを並べ替える必要があります。誰かが良いアイデアを得る?当然の

+0

あなたのコレクションの大きさに応じて、シャッフルを使用して、必要に応じて最初のいくつかの要素を取り上げることができます。あなたはおそらくこれをベンチマークしたいと思うかもしれません。あなたのコレクションは十分に大きく、シャッフルが遅くなる可能性があります。それで、あなたはこれから抜け出すシンプルさを取り消します。ここには[shuffle]の仕様があります(http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Collections.html#shuffle%28java.util.List%29) –

+0

より良い'Random'番号のgenを使用して、選択されたリストにすでに生成されたインデックスに番号があるかどうかを確認する方法があります。 'Collections'を使用してソート – Jon

答えて

9

を取得することができます:

public static int[] pickNRandom(int[] array, int n) { 

    List<Integer> list = new ArrayList<Integer>(array.length); 
    for (int i : array) 
     list.add(i); 
    Collections.shuffle(list); 

    int[] answer = new int[n]; 
    for (int i = 0; i < n; i++) 
     answer[i] = list.get(i); 
    Arrays.sort(answer); 

    return answer; 

} 

はこのようにそれを使用します

int[] mixColor = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}; 
int[] randomPicks = pickNRandom(mixColor, 5); 

このメソッドは、exac tly n要素がランダムに選択され、ソートされて返されます。また、入力配列が複製されていない限り、要素が何度も選択されず、結果の配列に重複がないことも保証されます。

上記のコードはうまくいきますが、intIntegerの間を行き来するのは煩わしく、入力配列が大きければ(たとえば、> 100.000要素)遅くなることがあります。まずそれをテストし、あなたのニーズに合っているかどうかを確認してください。

+0

アイデアはかなりグーソーです、そして、それは本当に有益です、歓声! – nich

+0

希望の結果を得るための本当に賢い方法..良い仕事 –

1
Random gen = new Random(); 
int max = mixCoor.length; // Maximum Random value to generate 

ArrayList<Integer> picked = new ArrayList<Integer>(); // List of picked numbers 

for(int i = 0; i < numToBePicked; i++) { 
    int index = gen.nextInt(max); 
    if(!picked.contains(mixCoor[index]) // If the number isn't already picked 
    picked.add(mixCoor[index]); // Add it to the "picked" list 
} 

Collections.sort(picked); // Sort the picked numbers into ascending order 
-1
Random random new Random(); 
for (int i=0;i<7;i++){ 
int a = mixColor[random.nextInt()%mixColor.length]; 
} 

、あなたはこの方法で試してみてくださいランダムのための種を使用し、よりランダム化された番号に

+2

この回答には、OPが要求したいくつかのものがありません:乱数とソートを繰り返すことはできません。上記のジョンの答えを見てください。 –

0

既存のJava API使用して、あなたが望むすべてを行うことができます。

public static Integer[] pickRandom(Integer[] array, int number) { 
    List<Integer> list = new ArrayList<Integer>(Arrays.asList(array)); 
    Collections.shuffle(list); 
    list = list.subList(0, number); 
    Collections.sort(list); 
    return list.toArray(new Integer[number]); 
} 

注:あなたはこの自分を変換する必要がありますので、あなたは、Integer[]、というよりもint[]でこの呼び出しを必要とします。また、コードサイズや複雑さの点で「効率的」である一方で、効率的ではありません(まだ使用可能かもしれませんが)。あなたがList<Integer>で始まるならば、このコードはまだ簡単です。

関連する問題