当我需要在 Java/Android 中洗牌时,我Collections.shuffle(List<?> list)
当然会使用 . 我曾经这样做过,结果似乎可以接受。但他们不是。
如本文所述,共有 52 个!52张扑克牌的可能独特的洗牌。这相当于大约 2^226。
但默认使用Collections.shuffle(List<?> list)
48位种子,因此只能创建 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);