gpt4 book ai didi

java - 如何真正洗牌

转载 作者:搜寻专家 更新时间:2023-10-30 21:10:40 24 4
gpt4 key购买 nike

当我需要在 Java/Android 中洗牌时,我使用 Collections.shuffle(List<?> list) , 当然。我一直这样做,结果似乎可以接受。但他们不是。

this paper 中所述, 有 52 个! 52 张扑克牌可能的独特洗牌。这相当于大约 2^226。

但是Collections.shuffle(List<?> list)使用 new Random()默认情况下使用 48-bit seed因此只能创建 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);

最佳答案

您可能只能从特定的开始安排中获得 248 种不同的手牌,但并不要求您每次都以相同的安排开始。

大概,在一副牌完成后(扑克牌、二十一点等),它的顺序是不确定的,并且任何一种重新排列都是合适的。

而且,如果您担心每次启动程序时都从固定排列开始,只需在退出时保留该顺序并在下次重新加载它即可。

无论如何,248 仍然是一个巨大的可能性(大约 280,000,000,000,000),对于纸牌游戏来说绰绰有余,当您意识到它限制洗牌而不是限制洗牌时更是如此安排。除非您是认真的统计学家或密码学家,否则您拥有的应该没问题。

关于java - 如何真正洗牌,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16361632/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com