2015-04-19 2 views
0

Я студент, изучающий Java (и работаю с NetBeans в школе). Мы пытаемся сделать простую программу Bingo (доски лото с 15 номерами в них, которые не повторяются)Попытка предотвратить повторение чисел (Java/NetBeans)

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 разных номеров). Я пробовал, и он не показывал мне никаких повторных цифр, но, возможно, это будет совпадение. На всякий случай, мы не можем использовать «ArrayList» или некоторые расширенные функции, потому что мы еще не изучили их в классе.

Любая помощь будет оценена по достоинству.

Спасибо!

Edit:

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

«Случайный» - неправильный подход. Как работает бинго? Вы не создаете случайные числа - вы вытаскиваете случайные числа ** один раз ** из сумки, содержащей все цифры. Поэтому вам нужен массив, содержащий все возможные числа, и случайным образом извлекать из него. Самое простое решение - создать массив '[1..15]', затем выполнить [Fisher-Yates shuffle] (http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle). –

+0

Он должен работать, но вы не разделили объявление 'sacados', если вы сделали его' int [90] 'по ошибке вы можете столкнуться с проблемами. Кроме того, было бы лучше, если бы это был массив булевых. – RealSkeptic

+0

Я сделал массив int из [91] для отсутствия проблем. Кроме того, я добавил к основному сообщению код, который делает вещи бинго. – piniacat

ответ

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]; 
} 

Это является более эффективным, как он никогда не выбирает мяч, который не был использован уже. Это может иметь большое значение, когда осталось несколько мячей.


Стоит помнить, что эти цифры не совсем случайным образом, они должны быть выбраны из числа вы не использовали раньше. Более простой способ сделать это - создать все возможные числа и перетасовать их. Как колода карт перетасовывается, а контейнер шариков устроен случайным образом.

например.

List<Integer> allBalls = IntStream.range(1, 91).boxed().collect(Collectors.toList()); 
Collections.shuffle(allBalls); 
List<Integer fifteenBalls = allBalls.subList(0, 15); 

Это оставит вас с 15 шарами, выбранными наугад, без дубликатов.

+0

Но ОП сказал, что он не должен использовать ничего, как 'ArrayList' или расширенные функции. – RealSkeptic

+0

Да, это было наложение учителями. – piniacat

+0

@Tchangla Это не мешает вам делать то же самое, но без этих классов. Все источники доступны;) –

Смежные вопросы