es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo aleatorizar un arreglo de tal manera que ningún elemento se encuentre en su posición original.

Se supone que debo tomar una matriz de enteros que comienza en 0 y llega hasta la longitud-1 de alguna otra matriz de enteros llamada ‘cards’ (que tiene una longitud ingresada por el usuario) y la aleatorice completamente de tal manera que ningún número esté en su posición original.
Logré generar la primera matriz, pero no tengo ni idea de cómo aleatorizar completamente una matriz, ¿alguien puede ayudarme?
Hasta ahora tengo:

int size = cards.length;
int[] numberList = new int[size];
for (int i = 0; i < size; i++) {
    numberList[i] = i;
}

Actualización:

private int[] shuffleIndex() {
    int size = cards.length;
    int[] numberList = new int[size];
    for(int i = 0; i < size; i++) {
        numberList[i] = i;
    }
    randomizer(numberList);
    return numberList;
}

private int[] randomizer(int[] input) {

int size = input.length;

Random random = new Random();

for (int i = size -1; i > 0; i--) {
    int j = random.nextInt(i + 1);
    int temp = input[i];
    input[i] = input[j];
    input[j] = temp;
}

for(int i = 0; i < size; i++) {

    if(input[i] == i) {
        randomizer(input);
    }
}
return input;
}
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para aleatorizar completamente el array, se puede usar el algoritmo de mezcla Fisher-Yates. Aquí hay una versión actualizada de su código que incorpora el algoritmo de mezcla:

    private int[] shuffleIndex() {
        int size = cards.length;
        int[] numberList = new int[size];
        for (int i = 0; i < size; i++) {
            numberList[i] = i;
        }
        randomizer(numberList);
        return numberList;
    }
    
    private int[] randomizer(int[] input) {
        int size = input.length;
        Random random = new Random();
        for (int i = size - 1; i > 0; i--) {
            int j = random.nextInt(i + 1);
            int temp = input[i];
            input[i] = input[j];
            input[j] = temp;
        }
        for (int i = 0; i < size; i++) {
            if(input[i] == i) {
                randomizer(input);
            }
        }
        return input;
    }
    

    El método shuffleIndex inicializa un array con los números del 0 a cards.length - 1, y luego lo pasa al método randomizer, que mezcla el array usando el algoritmo de mezcla Fisher-Yates. El método randomizer itera a través del array de derecha a izquierda y aleatoriamente intercambia cada valor con otro valor a su izquierda. El método también verifica si algún valor está en su posición original y re-mecla recursivamente el array hasta que ningún valor quede en su posición original. Finalmente, el método shuffleIndex devuelve el array mezclado.

Comments are closed.