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

Java:一次从数组中选择几个不同的随机数,java,arrays,Java,Arrays,有人能告诉我如何一次从一个数组中选择几个不同的随机数吗? 例如,有一个长整型数组。我想从中选出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)];

有人能告诉我如何一次从一个数组中选择几个不同的随机数吗? 例如,有一个长整型数组。我想从中选出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[]
是长整数数组。我可以这样做,但如果我想选择更多的数字,这将是非常复杂的。我还需要对它们进行分类。有人想出了好主意吗?

Random gen=new Random();
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
int max=mixCoor.length;//要生成的最大随机值 ArrayList picked=新建ArrayList();//挑选的号码列表 对于(int i=0;i
Random new Random();
对于(int i=0;i尝试使用此方法:

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;

}
该方法保证随机选取
n
个元素,并对它们进行排序返回。它还保证不会多次拾取任何元素,并且只要输入数组不存在重复项,生成的数组就不会有重复项


上面的代码工作正常,但必须在
int
Integer
之间来回切换很麻烦,如果输入数组很大(比如>100.000个元素),则可能会很慢。首先测试它,看看它是否适合您的需要。

您可以使用现有的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]);
}
公共静态整型[]pickRandom(整型[]数组,整数){
List List=newarraylist(Arrays.asList(array));
集合。洗牌(列表);
列表=列表。子列表(0,编号);
集合。排序(列表);
返回列表.toArray(新整数[数字]);
}

注意:您需要使用
Integer[]
,而不是
int[]
,来调用this,因此您必须自己进行转换。此外,尽管在代码大小和复杂度方面“高效”,但在性能方面这并不是那么高效(尽管它可能仍然可用)。如果您有一个
列表
,则此代码会更简单。

此答案缺少OP要求的几件事:无法重复随机数和排序。请参阅上面Jon的答案。根据您的集合的大小,您可以使用shuffle,然后根据需要拾取前几个元素。您可能希望基准测试-你的集合可能足够大,洗牌可能会很慢,这就取消了你从中获得的简单性。下面是一个更好的方法规范,可以使用
随机
数字生成器,查看挑选的列表是否在生成的索引中已经有数字。然后使用
集合
int[] mixColor = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
int[] randomPicks = pickNRandom(mixColor, 5);
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]);
}