Java中有一个扑克系统,它使用 Collections.shuffle() 在所有可用的卡片上处理卡之前。

因此,有4种类型的52张卡2-9,J,Q,K,a。

之后我们 Collections.shuffle().

问题是,似乎(直到现在我们还没有大统计数据,我们只能看到很多统计学推断),算法尚不清楚。

所以,是 Collections.shuffle() 可以使用扑克算法吗?


评论的答案:“不清楚”,我的意思是在某个时候非常非常神秘。许多用户抱怨“它与Live /其他Pokerroom不同”。我在这个系统上发挥了很多作用,必须说,我同意,我看到2000年以下的3次皇家闪光灯在该系统中发挥了作用,并在其他扑克室中进行了现场直播,直到今天,我看到了2个超过100.000次。

有帮助吗?

解决方案

如果这是一个严重的扑克应用程序,金钱可以换手,那么简短的答案是否定的。对于这样的事情,您应该真正使用真实随机性的硬件来源。

答案稍长于:如果您无法获得真正的随机性硬件, Collections.shuffle(List, Random) 可能 如果您提供一个足够好的 SecureRandom. 。该解决方案的棘手部分是找到一个良好的种子价值。

更新:根据您的澄清,我建议您研究如何播种PRNG(假设您已经在使用密码安全的实现;如果不是,请首先执行此操作)。你应该 不是 使用有限的种子。其他要考虑的事情:

  • 您可能应该为每个游戏实例化一个prng
  • 您应该只在双手之间洗牌;从您的问题来看,尚不清楚您还没有在翻牌,转弯,河等之间整理甲板。

其他提示

Collection.shuffle 使用O(n)实现 Fisher-Yates洗牌算法.

并且随机索引是用正常的Java选择的,因此它大约是均匀的:甲板的每次洗牌都与其他所有混音一样多。

这对于您想做的事情是可以的,但是当您想要真正的随机化时,您应该引入一些真正的随机因素(例如 System.currentTimeMillis() 用于播种随机数生成器)或更真实的东西,例如专门的硬件。

好的,我通常讨厌人们对我说这句话,但是是的。它与pickrandomcardbetbetbetbetbetbeteweween(1,52)一样好,并且在随机性方面使用rand()函数。

没有任何部分是,对于处理机会或随机值的任何内容,您需要适当的硬件,普通计算机甚至无法远程生成任何形式的真正随机结果。

编辑:如果您的宠物系统是为了玩乐,那是一回事,但是当涉及金钱时,人们会以这种方式绞死您。

我建议阅读本文:

我们如何学会在线扑克作弊

作者查看了一个软件包,发现了一些缺陷。一个严重的问题是种子。如果您从32位种子开始(并且在洗牌过程中不要生成新的独立种子),则只能生成2^32个不同的随机序列。有2^226个可能的52张卡片甲板的混合物,这意味着只会产生一小部分可能的甲板订购。

一名球员知道失败的5个卡位置(奥马哈7号)。如果玩家知道混洗算法,他可以根据他看到的卡片来猜测候选种子是什么。这为他提供了巨大的优势,可以推论隐藏卡的概率。

如果这是涉及金钱的严重扑克软件,那么答案将是否定的。 (为此,您需要一些真正的随机性来源。)但是,对于简单的情况,它与任何其他算法一样好。

如果您想要有关混音算法本身的更多信息,请参见 Java的收藏。Shuffle在做什么?.

问题在于随机生成的数字在统计上是随机的。这意味着随机牌的行为不像一张卡片,因为它比现实生活中的甲板混乱更随机。要拥有更现实的东西,您需要模拟现实生活中的卡片的方式,例如您剪裁了多少次。我看到了一个带有图表的站点,比较了真实骰子和计算机生成的结果的结果,该结果显示了结果的不同。计算机结果更加平均分布,但我似乎无法在Google上找到链接。

我可以告诉你,这不是大型扑克网站的做法。预先放置甲板使该卡序列可在游戏服务器中的内存中可用,即如果您可以访问服务器主机(就像OPS一样),则可以阅读它。相反,随时可以从甲板上随机挑选卡片(在硬件RNG之上使用安全随机)。当您获得“错误”的社区卡时,这有时会陷入困境,因为如果您刚刚等待毫秒更长的时间来打电话给它们与众不同:)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top