Когда мне нужно перетасовать колоду карт покера в Java/Android, я использую Collections.shuffle(List<?> list)
, конечно. Я когда-либо делал это, и результаты казались приемлемыми. Но это не так.
Как указано в этой статье, есть 52! возможны уникальные перетасовки колоды для покера с 52 карточками. Это составляет около 2 ^ 226.
Но Collections.shuffle(List<?> list)
по умолчанию использует new Random()
, который использует 48-битное семя и поэтому может создавать только 2 ^ 48 уникальных тасов - это всего лишь 3.49*10^(-52)
процентов всех возможных тасов!
Итак, как правильно перетасовать карты?
Я начал использовать SecureRandom
, но этого достаточно, наконец?
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);