Comenzando con aleatorio

Instalación o configuración

Instrucciones detalladas sobre cómo configurar o instalar aleatoriamente.

Mezcla Fisher-Yates

También conocido como el shuffle de Knuth y el shuffle de Durstenfeld-Fisher-Yates. Esta reproducción aleatoria toma una matriz de elementos n y los mezcla. El algoritmo es realmente aleatorio en el sentido de que, después de barajar, cada permutación de la matriz tiene la misma probabilidad.

En Java:

public static void shuffle(E[] deck) {

    //From the end, swap each card with a random card from the unswapped portion.
    for(int i = deck.length - 1; i > 0; i--)
    {
        //Pick an element from [0,i], inclusive.
        int chosenCard = (int) (Math.random() * (i + 1));

        E temp = deck[i];
        deck[i] = deck[chosenCard];
        deck[chosenCard] = temp;
    }
}

Tenga en cuenta: es necesario que el elemento de reemplazo provenga de [0,i] inclusive y no [0,i) exclusivo: de lo contrario, las permutaciones de la matriz donde los elementos permanecen en su lugar son imposibles, lo que no es realmente aleatorio.

Suponiendo que los números aleatorios toman O(1) para generarse, el algoritmo opera en el lugar y toma O(n) en tiempo y espacio. Una matriz mezclada de esta manera se puede usar para recuperar elementos que no se repiten en O (1) tiempo amortizado por elemento.

E[] deck;
int drawIndex;

//Elements are taken from an index that advances.
public E drawUniqueCard()
{
    //Once all cards have been drawn, reshuffle the deck and draw from the top.
    if(drawIndex == deck.length)
    {
        shuffle(deck);
        drawIndex = 0;
    }
    //Pull the next card off the deck.
    return deck[drawIndex++];
}