Estoy trabajando en un proyecto de estadísticas que involucra cartas y barajar, y me encontré con un problema con la generación de números aleatorios.
¡De un simple poco de matemática hay 52! posibles permutaciones de baraja, que es aproximadamente 2^226. Creo que esto significa que necesito un generador de números aleatorios con un mínimo de 226 bits de entropía, y posiblemente más (no estoy seguro de este concepto, por lo que cualquier ayuda sería genial).
A partir de una búsqueda rápida en Google, el generador Math.random() en Java tiene un máximo de 48 bits de entropía, lo que significa que la gran mayoría de las posibles combinaciones de barajas no estarían representadas. Así que este no parece ser el camino a seguir en Java.
Estaba vinculado a este generador pero aún no tiene una implementación de Java. También para un poco de contexto aquí está uno de mis algoritmos de barajado (utiliza el método Fisher-Yates). Si tiene alguna sugerencia para mejorar la eficiencia del código, también sería fantástico.
public void shuffle(int type, int swaps){ int[] newDeck = getNewDeck(); if(type == 1){ for(int i = 0; i < 52; i++){ int nextCardIndex = (int)(Math.random()*newDeck.length); deck[i] = newDeck[nextCardIndex]; newDeck = removeItem(nextCardIndex, newDeck); } } } public int[] getNewDeck(){ int[] newDeck = new int[52]; for(int i = 1; i <= 52; i++){ newDeck[i-1] = i; } return newDeck; } public int[] removeItem(int index, int[] array){ int[] newArray = new int[array.length-1]; for(int i = 0; i < index; i++){ newArray[i] = array[i]; } for(int i = index; i < array.length-1; i++){ newArray[i] = array[i+1]; } array = newArray; return array; }¿Ha examinado las adiciones recientes que se incluyen en JDK 17?
Hay muchos algoritmos disponibles:
Para barajar cartas, es probable que no necesite algo que sea criptográficamente seguro.
El uso de Collections.shuffle debería funcionar si proporciona un RNG decente.