我是一名学习Java的学生(并在学校与NetBeans合作)。 我们正在尝试做一个简单的宾果游戏程序(其中有15个数字的宾果游戏板并没有重复)
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 9; j = j + 2) {
aux = r.nextInt(90) + 1;
while (sacados[aux] == aux) {
aux = r.nextInt(90) + 1;
}
sacados[aux] = aux;
carton[i][j] = aux;
}
}
我不知道这段代码是否是一个很好的解决方案(这个小代码是我为选择15个不同的数字所写的)。我试过了,它没有向我显示任何重复的数字,但也许这将是一个巧合。 为了以防万一,我们还没有使用&#34; ArrayList&#34;或者一些高级功能,因为我们还没有在课堂上学到它们。
任何帮助将不胜感激。
谢谢!
编辑:
public static void jugar(int[][] carton) {
/**
* Módulo que permite introducir datos en variables *
*/
Scanner sc = new Scanner(System.in);
/**
* Módulo para utilizar la función "random" *
*/
Random r = new Random();
int aux;
/**
* Variable boolean que ayuda a comprobar que el número está en el
* cartón previamente o no *
*/
boolean seguir = true;
/**
* Array que almacena los números del cartón temporalmente para
* comprobar que no se repiten *
*/
int[] sacados = new int[91];
/**
* Array en la que almacenamos los numeros premiados con antelación *
*/
int[] ganadores = new int[15];
/**
* Indice para array de ganadores *
*/
int z = 0;
/**
* Variable que hace de contador para determinar bingo *
*/
int contador = 0;
/** Variable para seguir (s/n) **/
char seguirl;
/**
* Guardamos los números ganadores en una array diferente para
* mostrarlos al ganar *
*/
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 9; j = j + 2) {
ganadores[z] = carton[i][j];
z++;
}
}
while (contador != 15) {
if (seguir==true){
/** Si el número se repite, no seguirá y volverá a sacar otro número distinto **/
do {
aux = r.nextInt(90) + 1;
} while (sacados[aux] == aux);
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 9; j = j + 2) {
if (aux == carton[i][j]) {
carton[i][j] = -1;
contador++;
}
}
}
for (int i = 0; i < 3; i++) {
System.out.println("");
for (int j = 0; j < 9; j++) {
System.out.print(carton[i][j] + " ");
}
}
System.out.println("");
System.out.println("Nuevo número: " + aux);
System.out.println("");
System.out.println("¿Siguiente número (s/n)?:");
seguirl = sc.next().charAt(0);
if (seguirl == 115){
seguir = true;
}else{
seguir = false;
}
}else{
System.out.println("Partida abortada.");
System.exit(0);
break;
}
}System.out.println("BINGO!!!");
System.out.println("Los números premiados de esta tanda han sido:");
for (int i = 0; i < 15; i++) {
System.out.print(ganadores[i]+" ");
}
System.out.println("");
System.out.println("Y todos los que han salido");
for (int i = 0; i < 90; i++) {
if (sacados[i]!=0){
System.out.print(ganadores[i]+" ");
}
}
System.out.println("Fin de partida.");
System.exit(0);
}
这是宾果本身的方法。
答案 0 :(得分:0)
不使用任何内置功能,您可以
int[] balls = new int[90];
for(int i = 0; i < 90; i++) balls[i] = i + 1;
Random rand = new Random();
for(int i = 0; i < 15; i++) {
// select an unused ball at random.
// the number of balls which haven't been used is 90 - i.
int select = rand.nextInt(90 - i);
int number = balls[select];
System.out.println(number);
// remove the ball from the available array
balls[select] = balls[90 - i];
}
这更有效,因为它从未选择尚未使用过的球。当剩下的球很少时,这会产生很大的不同。
值得记住的是,这些数字并非完全随机,必须从之前未使用的数字中选择。一种更简单的方法是生成所有可能的数字并将它们混洗。就像一副纸牌被洗牌,一个球的容器随机排列。
e.g。
List<Integer> allBalls = IntStream.range(1, 91).boxed().collect(Collectors.toList());
Collections.shuffle(allBalls);
List<Integer fifteenBalls = allBalls.subList(0, 15);
这将为您留下15个随机选择的球,没有重复。