如何在java中不重复地显示从数组中随机选择的字符串
我正在尝试使用NetBeans IDE 6.9.1创建一个宾果游戏(我对编码很在行)。现在我一直在尝试制作宾果卡。对于5x5卡的盒子,我使用了jButtons。我无法将“B”宾果球随机化到“B”列。我有一个“工作”的代码,用于随机化哪个“B”球进入哪个“B”按钮,但我的方法不适用于我用来输出随机抽取的宾果球的jLabel。这是我的“随机B球代码”: 以下是用户在选择宾果游戏模式时单击提交按钮并生成卡片(不完整)的代码: 是的,这是重复的,也不是过度随机的,但我对阵列做了一些研究,因为我在计算机科学课上没有学过阵列,所以得到了以下结论:如何在java中不重复地显示从数组中随机选择的字符串,java,arrays,random,Java,Arrays,Random,我正在尝试使用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
0 0你必须知道Math.random()给出的数字在0和1之间
它从不给出1
0 < Math.random() < 1
0 < Math.random() * 2 < 2
0 <= (int)(Math.random() * 2) <= 1
0 0不要尝试使用数学。你不会得到均匀分布。使用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);
}
}
}