试图阻止数字重复(Java / NetBeans)

时间:2015-04-19 16:22:13

标签: java netbeans numbers repeat

我是一名学习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);

}

这是宾果本身的方法。

1 个答案:

答案 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个随机选择的球,没有重复。