Java/Android でポーカー カードのデッキをシャッフルする必要がある場合はCollections.shuffle(List<?> list)
、もちろん を使用します。私は今までこれを行ってきましたが、結果は受け入れられるように見えました。しかし、そうではありません。
この論文で概説されているように、52 あります。52 枚のカードのポーカー デッキの可能なユニークなシャッフル。これは約 2^226 になります。
しかし、デフォルトでは48 ビットのシードCollections.shuffle(List<?> list)
を使用するため、2^48 の一意のシャッフルしか作成できません。これは、考えられるすべてのシャッフルのほんの一部です!new Random()
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);