Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中不重复地显示从数组中随机选择的字符串_Java_Arrays_Random - Fatal编程技术网

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

如何在java中不重复地显示从数组中随机选择的字符串,java,arrays,random,Java,Arrays,Random,我正在尝试使用NetBeans IDE 6.9.1创建一个宾果游戏(我对编码很在行)。现在我一直在尝试制作宾果卡。对于5x5卡的盒子,我使用了jButtons。我无法将“B”宾果球随机化到“B”列。我有一个“工作”的代码,用于随机化哪个“B”球进入哪个“B”按钮,但我的方法不适用于我用来输出随机抽取的宾果球的jLabel。这是我的“随机B球代码”: 以下是用户在选择宾果游戏模式时单击提交按钮并生成卡片(不完整)的代码: 是的,这是重复的,也不是过度随机的,但我对阵列做了一些研究,因为我在计算机科

我正在尝试使用NetBeans IDE 6.9.1创建一个宾果游戏(我对编码很在行)。现在我一直在尝试制作宾果卡。对于5x5卡的盒子,我使用了jButtons。我无法将“B”宾果球随机化到“B”列。我有一个“工作”的代码,用于随机化哪个“B”球进入哪个“B”按钮,但我的方法不适用于我用来输出随机抽取的宾果球的jLabel。这是我的“随机B球代码”:

以下是用户在选择宾果游戏模式时单击提交按钮并生成卡片(不完整)的代码:

是的,这是重复的,也不是过度随机的,但我对阵列做了一些研究,因为我在计算机科学课上没有学过阵列,所以得到了以下结论:

    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的后期项目,不,我没有晚开始)。谢谢您的时间。

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

它从不给出1

0 < Math.random() < 1
0 < Math.random() * 2 < 2
0 <= (int)(Math.random() * 2) <= 1
00你必须知道Math.random()给出的数字在0和1之间

它从不给出1

0 < Math.random() < 1
0 < Math.random() * 2 < 2
0 <= (int)(Math.random() * 2) <= 1
00不要尝试使用数学。你不会得到均匀分布。使用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)
}
Random rand=new Random();
随机序中的列表=新的ArrayList();
列表项=新建ArrayList();
项目。添加(“blah1”);
项目。添加(“blah2”);
项目。添加(“blah3”);
而(!items.isEmpty()){
String removed=items.remove(rand.nextInt(items.size());
在随机顺序中添加(删除)
}

然后你有一个随机排列的物品清单。它不是真正的随机,只是伪随机如果你需要真正的随机,你必须使用SecureRandom。我相信这在功能上对Java 8流来说可能是一种更简单的方法,但我没有太多时间来处理它们,如果答案是老式的,那么很抱歉。

不要尝试使用数学。随机你不会得到均匀分布。使用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)
}
Random rand=new Random();
随机序中的列表=新的ArrayList();
列表项=新建ArrayList();
项目。添加(“blah1”);
项目。添加(“blah2”);
项目。添加(“blah3”);
而(!items.isEmpty()){
String removed=items.remove(rand.nextInt(items.size());
在随机顺序中添加(删除)
}

然后你有一个随机排列的物品清单。它不是真正的随机,只是伪随机如果你需要真正的随机,你必须使用SecureRandom。我相信这在功能上对Java 8流来说可能是一种更简单的方法,但是我没有太多的时间来处理它们,如果答案是老式的,那么很抱歉。

我希望这不会比您现在的位置提前太多,但这是从一袋
N
项(球)中提取
M
元素而不重复的最简单方法,就是简单地将所有元素添加到a和it中,然后使用获取第一个
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);
}
样本输出

[B9、B5、B3、B2、B15]

更新

好的,为了教你一点,一个
列表
有点类似于一个数组,但功能更强大。它包含一个值序列,类似于一个数组,并且这些值从
0
开始索引,也类似于一个数组

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

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

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

List<String> balls = draw("B", 15, 5);
btn1B.setText(balls.get(0));
btn2B.setText(balls.get(1));
btn3B.setText(balls.get(2));
btn4B.setText(balls.get(3));
btn5B.setText(balls.get(4));
List balls=draw(“B”,15,5);
btn1B.setText(balls.get(0));
btn2B.setText(balls.get(1));
btn3B.setText(balls.get(2));
btn4B.setText(balls.get(3));
btn5B.setText(balls.get(4));

我希望这不会比您现在的位置提前太多,但是从一袋
N
项目(球)中提取
M
元素而不重复的最简单方法是将所有元素添加到a和it中,然后使用获取第一个
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);
}
样本输出

[B9、B5、B3、B2、B15]

更新

好的,为了教你一点,一个
列表
有点类似于一个数组,但功能更强大。它包含一个值序列,类似于一个数组,并且这些值从
0
开始索引,也类似于一个数组

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

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

在那之后
 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);
        }
    }
}