java—如何从数组中获取随机对象

envsm3lx  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(401)

我正在看这个程序,删除两个随机对象在同一时间从一个袋子。在袋子里有两种不同颜色的物体,根据物体的颜色,会发生不同的事情。我现在取随机值的方法是:

while (bag.size() > 1) {
            count++;
            int select1 = rnd.nextInt(bag.size());
            Balls indexPos1 = bag.get(select1);
            int select2 = rnd.nextInt(bag.size());
            Balls indexPos2 = bag.get(select2);
            System.out.println(select1);
            System.out.println(select2);

但在程序结束时,如果它碰巧采取了同一对象的索引,那么袋内的颜色变化是错误的,错误的结果打印。我将粘贴到循环的其余部分。

int count = 0;
        Random rnd = new Random();
// Depending on what colour the balls are either black ball is placed or white.
        while (bag.size() > 1) {
            count++;
            int select1 = rnd.nextInt(bag.size());
            Balls indexPos1 = bag.get(select1);
            int select2 = rnd.nextInt(bag.size());
            Balls indexPos2 = bag.get(select2);
            System.out.println(select1);
            System.out.println(select2);
            if (bag.size() != 1) {
                System.out.println(bag);
                System.out.println("Printing size: " + bag.size());
                if (bag.get(select1).equals(blackBalls) && indexPos2.equals(blackBalls)) {
                    System.out.println("Both balls are black.");
                    System.out.println("Removing black ball");
                    bag.add(blackBalls);
                    bag.remove(blackBalls);
                    bag.remove(blackBalls);
                    continue;
                }if (indexPos1.equals(whiteBalls) && indexPos2.equals(whiteBalls)) {
                    System.out.println("both Balls are white");
                    bag.add(blackBalls);
                    bag.remove(whiteBalls);
                    bag.remove(whiteBalls);
                    System.out.println("Removing 2 white balls. adding black.");
                    continue;
                }if (indexPos1.equals(whiteBalls) && indexPos2.equals(blackBalls) || indexPos1.equals(blackBalls) && indexPos2.equals(whiteBalls)) {
                    bag.add(whiteBalls);
                    bag.remove(select1);
                    bag.remove(select2);
                    System.out.println("Both balls are different.");
                    System.out.println("Removing white ball");
                }
            }
        }

我不知道如何从一个数组中随机抽取两个对象,所以它不会选择同一个对象两次。任何帮助或反馈都将不胜感激。

rta7y2nd

rta7y2nd1#

你有几个选择。
洗牌整个集合,然后采取前2个元素。
这当然会“破坏”它已经拥有的任何订单,而且它还需要付出一点沉重的代价,因为你只需要2个随机元素,但是 Collections.shuffle 除非你有成千上万的元素在里面,否则这不会是一个性能问题。
继续挑选随机数。
将第二个“get a random index”调用转换为do/while循环,该循环不断地选取一个数字,直到得到一个不等于第一个元素的数字。请注意,如果你最终得到一个只有一个元素的包,那么这个循环将永远存在,所以请确保你首先检查这个元素并采取适当的行动。
选择一个随机数减去1,然后调整。
而不是 .nextInt(bag.size()) ,做 .nextInt(bag.size() - 1) ,如果这样得到的索引等于或大于第一个索引,则增量为1。然后有效地转化为从集合[0,1,2,3,5,6,7]中挑选一个均匀分布的随机数,假设一个包包含8个元素,选择的第一个索引是4。

相关问题