Java:一次从数组中选择几个不同的随机数

时间:2011-12-07 02:33:02

标签: java arrays

有人能告诉我如何一次从阵列中选择几个不同的随机数? 例如,有一个long int数组。我想从中挑选7个数字。所有数字必须不一样,并按增加顺序排序。

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[]是长整数数组。我可以用这种方式做,但如果我想选更多数字,这将非常复杂。我也需要对它们进行排序。有人得到好主意吗?

4 个答案:

答案 0 :(得分:10)

尝试使用此方法:

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);

该方法保证随机选取正好n个元素,并且它们将被返回排序。它还保证不会多次拾取任何元素,并且只要输入数组没有重复,结果数组就不会有重复。

上面的代码工作正常,但是在intInteger之间来回切换很麻烦,如果输入数组很大(例如,> 100.000个元素),它可能会很慢。首先进行测试,看看它是否符合您的需求。

答案 1 :(得分: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

答案 2 :(得分: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>开始,这段代码会更简单。

答案 3 :(得分:-1)

Random random  new Random();
for (int i=0;i<7;i++){
int a = mixColor[random.nextInt()%mixColor.length];
}

当然,您可以使用随机种子获得更多随机数