我必须使用2D阵列打印宾果板,而我使用的方法具有逻辑意义,但我似乎无法弄清楚为什么它仍然会生成相同的数字。有什么想法吗?我已经尝试了arraylist,但它是一维数组,如果它有可能是2D的概率,有人可以帮忙。 *****更新了,所以我使用了一些东西,我仍然卡住了。
package bingo.arrays.assignment;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class bingoooooooooooooo {
public static void main(String[] args) {
int[][] card = new int[5][5];
display1(card);
}
public static void display1(int[][] card) {
int[] colm = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
int v = 1, z = 15;
int x = 10000;
List l = new ArrayList();
for (int i : colm) {
l.add(i);
}
Collections.shuffle(l);
//do {
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
boolean numberFound = false;
while (!numberFound) {
int number1 = (int) (Math.random() * z) + v;
if (!checkNumber(number1, card, j)) {
break;
}
card[i][j] = number1;
System.out.print("|" + card[i][j]);
}
// if (card[i][j] > 25) {
// x++;
// }
}
v = v + 15;
z = z + 15;
System.out.println(" ");
}
//}while (true);
}
public static boolean checkNumber(int number, int[][] card, int j) {
for(int a = 0; a <= j; a++) {
if(card[i][a] == number) return false;
}
return true;
}
}
答案 0 :(得分:1)
基本上,您有重叠的范围,数字可以在0
到z
加v
的范围内。发生的是一个数字是在非常低的范围内产生的,但是v
不足以将其移动到超出前一组范围的范围
例如......
z == 130
,v == 13
(0.289 * 130) + 31 = 68
(0.304 * 130) + 31 = 70
(0.934 * 130) + 31 = 152
(0.85 * 130) + 31 = 141
(0.902 * 130) + 31 = 148
z == 145
,v == 13
(0.731 * 145) + 46 = 152
(0.672 * 145) + 46 = 143
(0.016 * 145) + 46 = 48
(0.292 * 145) + 46 = 88
(0.35 * 145) + 46 = 96
您可以看到两组中的数字相互重叠。问题只会随着z
变得更大而变得更糟,因为它有更多的空间来生成重叠数字。
现在,我确定你可以使用一些非常棒的mathamtical forumal,但我为此懒惰(而且愚蠢),相反,我会使用{某种类型的{1}}生成随机序列的25个数字。这将确保每个值都是唯一的
Set
将打印类似......
的内容public static void display1(int[][] card) {
// Create the set
Set<Integer> numbers = new HashSet<>(5 * 5);
// Keep looping until we get 25 numbers
while (numbers.size() < 5 * 5) {
// Generate a random number
numbers.add((int)Math.round(Math.random() * 100));
}
// This is just because I'm lazy...
List<Number> listOfNumbers = new ArrayList<>(numbers);
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
// Assign the value to the array...
card[i][j] = (int)listOfNumbers.remove(0);
}
}
// Add just for printing...you could do this in the previous loop
// but I just wanted to keep it clean...
for (int i = 0; i < card.length; i++) {
for (int j = 0; j < card[i].length; j++) {
System.out.printf("|%3d", card[i][j]);
}
System.out.println("|");
}
}
现在,如果你没有附加到阵列,你可以使用类似......
| 0| 2| 71| 9| 74|
| 16| 22| 87| 24| 28|
| 93| 30| 33| 40| 41|
| 42| 49| 50| 51| 52|
| 55| 56| 59| 60| 63|
计算给定行/列的int index = (row * 5 + col);
偏移量index
List
答案 1 :(得分:0)
您的问题似乎只是检查以前的号码。
您需要遍历当前部分中的所有数字,如下所示:
boolean numberFound = false;
while(!numberFound) {
int number1 = (int) (Math.random() * z) + v;
if(!checkNumber(number1, card, j)) break;
card [i][j]=number1;
System.out.print("|" + card[i][j]);
}
public static boolean checkNumber(int number, int[][] card, int j) {
for(int a = 0; a <= j; a++) {
if(card[i][a] == number) return false;
}
return true;
}