java—更有效的随机选择上界所有数字的方法?

xv8emn3q  于 2021-06-30  发布在  Java
关注(0)|答案(3)|浏览(400)

这个问题在这里已经有答案了

数组的随机洗牌(29个答案)
如何使用给定范围内随机洗牌的数字创建int数组[重复](2个答案)
上个月关门了。
我想所有的数字上限随机选择,从1到上限的每个数字只出现一次。例如,如果我有数字5。我希望所有从1到5的数字都可以随机打印到一个数组中,例如[5,2,3,1,4]。
我会用一个双for循环来实现这一点,并检查我的随机数生成器是否给出了一个已经选择的数字,如果没有,我会将值存储到数组中。这似乎是一个非常低效的方法,有没有更好的方法呢?

7nbnzgx9

7nbnzgx91#

解决这个问题的一种方法是生成一个包含1到n的数组,然后将其洗牌;请看@bohemian's answer以获得一种简洁的表达方式。。。虽然他的代码产生了 List<Integer> 而不是一个 int[] .
但是,除非您能够预测n可能很大(或者这个过程要进行很多次),否则您的解决方案的(假定的)低效性不应该是一个问题。抵制过早优化的诱惑。。。

xyhw6mcr

xyhw6mcr2#

我认为while循环可以帮助您使用它,并使用contains检查数字是否在列表中。

public class Main
    {
        public static void main(String[] args) {
            // set the upper bound
            int upperBound = 5;

            // create an ArrayList to store the numbers
            List<Integer> numList = new ArrayList<Integer>(upperBound-1);

            // use random object to generate random number
            Random rand = new Random();

            // use a while loop to generate random number
            while(numList.size() <= upperBound){
                int i = rand.nextInt(upperBound+1);
                if(!numList.contains(i)&&i!=0){
                    numList.add(i);
                }
            }

            // print the value
            for(int num:numList){
                System.out.println(num);
            }

        }
    }
xam8gpfp

xam8gpfp3#

试试这个:

List<Integer> list = IntStream.rangeClosed(1, upperBound)
                              .boxed().collect(toList());
Collections.shuffle(list);

相关问题