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

Java 如何从数组中获取随机对象,java,Java,我正在观看这个程序,它一次从一个袋子里取出两个随机物体。包内有两种不同颜色的物品,根据物品的颜色不同,会发生不同的事情。我现在获取随机值的方式是: while (bag.size() > 1) { count++; int select1 = rnd.nextInt(bag.size()); Balls indexPos1 = bag.get(select1); int select2 = rn

我正在观看这个程序,它一次从一个袋子里取出两个随机物体。包内有两种不同颜色的物品,根据物品的颜色不同,会发生不同的事情。我现在获取随机值的方式是:

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

我不知道如何从一个数组中获取两个随机对象,所以它不会两次选择同一个对象。非常感谢您的帮助或反馈。

您有一些选择

  • 洗牌整个集合,然后取前2个元素

    这当然会“破坏”它已经拥有的任何订单,而且它的支付成本也有点高,因为您只需要2个随机元素,但是
    集合。除非有成千上万的元素在其中,否则洗牌将不会成为性能问题

  • 继续挑选随机数

    将第二个“get a random index”调用转换为do/while循环,该循环不断地选取一个数字,直到得到一个不等于第一个元素的数字。请注意,如果您最终得到一个只有一个元素的包,那么这将永远循环,因此请确保您首先检查该元素并采取适当的行动

  • 选择一个小于1的随机数,然后调整

    不要使用
    .nextInt(bag.size())
    ,而是使用
    .nextInt(bag.size()-1)
    ,如果获得的索引等于或大于第一个索引,则增加1。这实际上转化为从集合[0,1,2,3,5,6,7]中选取一个均匀分布的随机数,假设一个包包含8个元素,选择的第一个索引是4