Cómo barajar realmente un mazo de cartas
Cuando necesito barajar una baraja de cartas de póker en Java / Android, usoCollections.shuffle(List<?> list)
, por supuesto. Alguna vez he estado haciendo esto y los resultados parecían aceptables. Pero no lo son.
Como se indica eneste papel, hay 52! posibles barajas únicas de un mazo de póquer de 52 cartas. Eso equivale a unos 2 ^ 226.
PeroCollections.shuffle(List<?> list)
usosnew Random()
por defecto que utiliza unaSemilla de 48 bits y, por lo tanto, solo puede crear 2 ^ 48 shuffles únicos, que es solo3.49*10^(-52)
¡Porcentaje de todas las barajas posibles!
Entonces, ¿cómo barajar las cartas de la manera correcta?
He empezado a usarSecureRandom
, pero es suficiente, finalmente?
List<Card> cards = new ArrayList<Card>();
...
SecureRandom secureRandom;
try {
secureRandom = SecureRandom.getInstance("SHA1PRNG");
}
catch (NoSuchAlgorithmException e) {
secureRandom = new SecureRandom();
}
secureRandom.nextBytes(new byte[20]); // force SecureRandom to seed itself
Collections.shuffle(cards, secureRandom);