Estoy encontrando con un problema de generación de 6 números al azar entre 1 y 6 en Java. Todos los números tienen que ser únicos. Cuando entro en kolon valor 5, las matrices deben ser como este:

1 2 3 4 5 6
1 2 3 4 5 6
1 2 3 4 5 6
1 2 3 4 5 6

No quiero el programa para generar los mismos dos números. ¿Qué está mal aquí?

Código correspondiente:

public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("Please enter row quantity: ");
int kolon = input.nextInt();
Integer[][] dizi_asil = new Integer[kolon][6];
for (int i = 0; i < kolon; i++) {
Integer[] dizi = new Integer[6];
for (int j = 0; j < 6; j++) { 
dizi[j] = (int) ((Math.random() * 6) + 1);  
for (int u = 0; u < 1; u++) { 
for (int k = 0; k < j; k++) { 
while (dizi[k] == dizi[j]) { 
dizi[j] = (int) ((Math.random()* 6)  + 1);
u++;
}
}
}
dizi_asil[i][j] = dizi[j];
}
Arrays.sort(dizi_asil[i]);
}
for (int i = 0; i < dizi_asil.length; i++) {
for (int k = 0; k < dizi_asil[i].length; k++) {
System.out.print(dizi_asil[i][k] + "\t");
}
System.out.println();
}
  • 6 únicos números entre 1 y 6 no son al azar. Ellos siempre van a ser 1,2,3,4,5,6. Su orden puede ser al azar, pero no los números.
  • Por qué 4 filas si kolon=5 en tu ejemplo ?
  • También, usted está llamando Arrays.sort(dizi_asil[i]);. Así que ¿por qué esperar que las matrices de no ser ordenados???
  • por ejemplo : cuando ejecuto el programa , algunas veces me hago 1 2 4 5 6 6 . es incorrecto necesito tener siempre 1 2 3 4 5 6
  • Usted no está mirando para generar 6 números al azar, sino más bien una permutación aleatoria de los números del 1 al 6. Trate de Collection.shuffle como otros han señalado en sus respuestas.

6 Comentarios

  1. 5

    Muy fácil de solucionar – reemplazar u++; con u--;. ++ va a hacer el loop de parada, -- hará a llevar a cabo.

    Aunque me gustaría sugerir algo más parecido a los de abajo. Espero que sea bastante fácil de entender.

    Integer[] dizi = new Integer[6];
    for (int j = 0; j < 6; j++)
    {
    boolean isValid;
    do
    {
    dizi[j] = (int) ((Math.random() * 6) + 1);
    isValid = true;
    for (int k = 0; isValid && k < j; k++)
    if (dizi[k] == dizi[j])
    isValid = false;
    }
    while (!isValid);
    dizi_asil[i][j] = dizi[j];
    }

    También me gustaría sugerir la clase al Azar, que tiene un nextInt(int) método, que es mejor que (int) ((Math.random() * 6) + 1).

    Pero arrastrando los pies es probablemente una manera más rápida de hacerlo. Utilizar la API como una de las otras respuestas o mirar en el Fisher-Yates /Knuth shuffle para un fácil algoritmo de aleatorización.

    • muchas gracias.usted ha sido muy útil
  2. 6

    Esta es una manera fácil:

    List<Integer> list = Arrays.asList(1,2,3,4,5,6);
    Collections.shuffle(list);
    //you can convert it to an array if you need to.
    • por ejemplo : cuando ejecuto el programa , algunas veces me hago 1 2 4 5 6 6 . es incorrecto necesito tener siempre 1 2 3 4 5 6
    • A continuación, deje de usar la ineficiente (y buggy) forma y usar el fragmento de código que he proporcionado.
  3. 3

    Intentar Colecciones.shuffle(lista);

    List<Integer> list = new ArrayList<Integer>();
    for(int i = 1; i<7 ; i++)
    list.add(i);

    O usted puede hacer :

    List<Integer> list = Arrays.asList(1,2,3,4,5,6)
    Collections.shuffle(list);

    Recorrer la lista y obtener un valor único de cada tiempo.

  4. 1

    Un camino mucho más corto es el uso de shuffle como muchos han mencionado ya.

    public static void main(String... ignored) {
    Scanner input = new Scanner(System.in);
    System.out.println("Please enter row quantity: ");
    List<Integer> rolls = Arrays.asList(1, 2, 3, 4, 5, 6);
    for (int i = 0, rows = input.nextInt(); i < rows; i++) {
    Collections.shuffle(rolls);
    System.out.println(rolls);
    }
    }

    si se ejecuta se puede conseguir algo como

    Please enter row quantity: 
    5
    [5, 6, 3, 2, 4, 1]
    [5, 4, 3, 6, 2, 1]
    [6, 4, 2, 3, 5, 1]
    [3, 1, 6, 2, 5, 4]
    [4, 1, 6, 3, 5, 2]
  5. 0

    Importaciones:

    import acm.util.RandomGenerator;
    private RandomGenerator rgen = RandomGenerator.getInstance();

    Elegir:

    randnum = rgen.nextInt(1, 6);

    Este elige un número aleatorio entre 0 y 5. Usted puede hacer esto por 1 a 6:

    randnum = rgen.nextInt(2, 7);

    O:

    randnum = rgen.nextInt(1, 6);
    randnum++;

Dejar respuesta

Please enter your comment!
Please enter your name here