我正在尝试使用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项目,而且我没有迟到)。谢谢你的时间。
答案 0 :(得分:1)
我希望这不会远远超出你的位置,但是从M
个项目(球)中提取N
元素而不重复的最简单方法是简单地添加所有要素List
和shuffle()
,然后使用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_1
或averageRandom_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流的功能,但我没有太多的时间来捣乱它们,如果答案是老式的,那就很抱歉。