【问题标题】:Java: pick several different random numbers from array in one timeJava:一次从数组中选择几个不同的随机数
【发布时间】:2026-02-19 15:55:02
【问题描述】:

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

【问题讨论】:

  • 根据您的收藏有多大,您可以使用随机播放,然后根据需要选择前几个元素。您可能想要对此进行基准测试 - 您的集合可能足够大,并且 shuffle 可能会很慢,这会取消您从中获得的简单性。这是shuffle 的规范
  • 更好的方法是使用Random 编号生成并查看选择的列表是否已经在生成的索引处具有编号。然后使用Collections 进行排序

标签: java arrays


【解决方案1】:

试试这个方法:

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 个元素),它可能会很慢。先测试一下,看看它是否符合您的需求。

【讨论】:

    【解决方案2】:
    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
    

    【讨论】:

      【解决方案3】:

      您可以使用现有的 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&lt;Integer&gt; 开头,则此代码会更简单。

      【讨论】:

        【解决方案4】:
        Random random  new Random();
        for (int i=0;i<7;i++){
        int a = mixColor[random.nextInt()%mixColor.length];
        }
        

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

        【讨论】:

        • 这个答案缺少 OP 要求的几件事:不能重复随机数和排序。请参阅上面乔恩的回答。