如何在java中显示来自数组中随机选择的字符串而不重复

时间:2016-06-21 02:58:46

标签: java arrays random

我正在尝试使用NetBeans IDE 6.9.1创建一个宾果游戏(我在编码时使用了noob)。现在,我一直试图创造宾果卡。对于5x5卡的盒子,我使用了jButton。我无法将" B"随机化。宾果球落在" B"柱。我有一个"工作的代码"用于随机化哪些" B"球进入了哪个" B" jButton,但我的方法不适用于我用来输出随机绘制的宾果球的jLabel。这是我的"随机B球代码:"

String[] Bball1 = {"B5", "B6", "B11"};
String Brandom1 = (Bball1[new Random().nextInt(Bball1.length)]);
String[] Bball2 = {"B1", "B8", "B15"};
String Brandom2 = (Bball2[new Random().nextInt(Bball2.length)]);
String[] Bball3 = {"B3", "B10", "B13"};
String Brandom3 = (Bball3[new Random().nextInt(Bball3.length)]);
String[] Bball4 = {"B2", "B9", "B14"};
String Brandom4 = (Bball4[new Random().nextInt(Bball4.length)]);
String[] Bball5 = {"B4", "B7", "B12"};
String Brandom5 = (Bball5[new Random().nextInt(Bball5.length)]);

以下是用户在选择宾果图案时点击提交按钮并生成卡片的代码(不完整):

    btnSubmit.setEnabled(false);
    cboPattern.setEnabled(false);
    btn1B.setText(Brandom1);
    btn2B.setText(Brandom2);
    btn3B.setText(Brandom3);
    btn4B.setText(Brandom4);
    btn5B.setText(Brandom5);

是的,这是重复的,而不是过于随意,但我对阵列做了一些研究,因为我还没有在我的计算机科学课上学过它们,并得到了这个:

    public static void main(String[] Bballs) {
    String[] Bball;
    Bball = new String[2];
    Bball[0] = "B1";
    Bball[1] = "B2";
    Bball[2] = "B3";

    int num = (int) (Math.random() * 2);
    System.out.println(Bball[num]);
}

这只是一个测试代码,你可以看到我仍然可以获得B1超过一次,这不是我想要的宾果卡和随机挑选的宾果球(我没有'开始了)。另外,每当我运行程序时,它都不会打印出最后一行。我需要在星期三结束时完成这项工作:/(这是一个已故的ISU项目,而且我没有迟到)。谢谢你的时间。

4 个答案:

答案 0 :(得分:1)

我希望这不会远远超出你的位置,但是从M个项目(球)中提取N元素而不重复的最简单方法是简单地添加所有要素Listshuffle(),然后使用subList()获取前M个值。

这是执行此操作的通用方法:

private static List<String> draw(String ballPrefix, int noOfBalls, int noToDraw) {
    List<String> balls = new ArrayList<>();
    for (int ballNo = 1; ballNo <= noOfBalls; ballNo++)
        balls.add(ballPrefix + ballNo);
    Collections.shuffle(balls);
    return balls.subList(0, noToDraw);
}

测试

System.out.println(draw("B", 15, 5));

示例输出

[B9, B5, B3, B2, B15]

<强>更新

好的,为了教一点,List有点类似于数组,但更强大。它包含一系列值,如数组,值从0开始索引,也像数组一样。

与使用arr.length获取长度的数组不同,对于列表,您调用list.size()。您可以调用arr[2]

,而不是使用list.get(2)检索值

您可以调用arr[2] = 7而不是使用list.set(2, 7)分配值,但这不常见。这是因为,与使用new String[5]分配的数组(分配5个值的固定大小数组)不同,使用new ArrayList()分配一个列表,并且在调用时,它将根据需要增大{1}},就像上面的方法一样。

在超短简介之后,以下是您使用上述方法的方法:

add()

答案 1 :(得分:1)

如果您想获得随机数,可以使用Math.random()Random,这与您的问题无关。您的问题是您想要展示的。一种方法是从特殊的Max num中随机获取,并且Max不会更改。我想这就是你现在使用的东西。另一种方法是,当您从特殊的Max num中获取随机数,然后删除随机数时,请确保使用每个数字(从Min到Max)。 Java有Collections.java工具,它具有shuffle功能,它可以使整个列表随机。以下是您的示例测试代码。如果您希望每个num(从Min到Max)以相同的速率出现,您可以使用averageRandom_1averageRandom_2

 import java.util.*;
public class Main {

    public static void main(String[] args) {
        System.out.println("Hello World!");
        String[] src = new String[]{"B1", "B2", "B3", "B4", "B5"};
        List<String> srcList = Arrays.asList(src);

   /*     for(int i = 0; i < srcList.size(); i++){
            System.out.print(" random = " + getRandom_2(0, srcList.size()));
        }*/

        averageRandom_2(srcList);
    }

 /**
 * @param min
 * @param max
 * @return [min, max), note it can't return max
 */
public static int getRandom_1(int min, int max){
    return (int)(min + Math.random()*(max-min));
}

/**
 * @param min
 * @param max
 * @return [min, max), note it can't return max
 */
public static int getRandom_2(int min, int max){
    Random random = new Random();
    return random.nextInt(max-min) + min;
}

    public static void averageRandom_1(List<String> data){
        List<String> dataCopy = new ArrayList<>();
        dataCopy.addAll(data);
        Collections.shuffle(dataCopy);
        for(String item : dataCopy){
            System.out.println("--" + item + "--");
        }
    }

    public static void averageRandom_2(List<String> data){
        List<String> dataCopy = new ArrayList<String>(data);
        while(dataCopy.size() > 0) {
            int random = getRandom_2(0, dataCopy.size());
            System.out.println("random = " + random + "--" + dataCopy.get(random) + "--");
            dataCopy.remove(random);
        }
    }
}

请记住random.nextInt(value)将0返回(值 - 1)。希望能帮到你。

答案 2 :(得分:0)

你必须知道Math.random()给出的数字在0和1之间。

永远不会给1。

0 < Math.random() < 1
0 < Math.random() * 2 < 2
0 <= (int)(Math.random() * 2) <= 1

注意地板逻辑,它使你永远不会得到索引2.

答案 3 :(得分:0)

不要尝试使用Math.random,你不会得到均匀的分布。使用List和Random.nextInt(int)可以得到一个相当简单的解决方案。

Random rand = new Random();
List<String> inRandomOrder = new ArrayList<>();
List<String> items = new ArrayList<>();
items.add("blah1");
items.add("blah2");
items.add("blah3");

while (!items.isEmpty()) {
    String removed = items.remove(rand.nextInt(items.size()));
    inRandomOrder.add(removed)
}

然后您会以随机顺序列出您的商品。如果您需要真正随机的话,它不是真正随机的只是伪随机您必须使用SecureRandom。我确信这可能是一种更简单的方法来实现Java 8流的功能,但我没有太多的时间来捣乱它们,如果答案是老式的,那就很抱歉。