扑克游戏的商业级随机化

时间:2011-03-17 20:56:00

标签: algorithm random mapping poker

8 个答案:

答案 0 :(得分:14)

你正在大大过度复杂化问题。您需要两个组件来解决您的问题:

  1. 改组算法
  2. 一个足够高质量的随机数生成器,用于使用混洗算法。
  3. 第一个很简单,只需使用Fisher-Yates shuffle算法。

    对于第二种情况,如果你希望sufficient degrees of freedom能够生成每种可能的排列(52种可能性),那么你需要至少226位的熵。无论您执行多少冗余哈希,使用系统时钟都不会为您提供超过32或64位的熵(实际上,大多数位是可预测的更少)。找到一个使用256位种子并使用256个随机位播种的RNG(引导问题,但您可以使用/ dev / random或硬件RNG设备)。

答案 1 :(得分:6)

你没有提到你所使用的操作系统,但大多数现代操作系统都预先制作了高质量熵的来源。在Linux上,它是/dev/random/dev/urandom,您可以从中读取任意数量的随机字节。

如果您想要良好的随机性,编写自己的随机数生成器非常重要。任何自制软件解决方案都可能存在缺陷,可能会被破坏并预测其产出。

答案 2 :(得分:5)

如果你仍然使用伪随机生成器,无论你做了多少次确定性操作,你都永远不会提高你的随机性。事实上,你可能会让它变得更糟。

我会使用商业随机数生成器。大多数人使用硬件解决方案,如盖革计数器。有些人使用现有的用户输入作为熵源,例如计算机麦克风中的背景噪音或键盘敲击之间的延迟。

编辑:

您提到您还想知道如何将此映射回到随机播放算法。那部分实际上非常简单。一种直截了当的方式是Fisher-Yates shuffle.基本上你需要从RNG得到的是一个均匀分布在0到51之间的随机数。你可以在给定任何RNG的情况下进行计算,并且通常构建在一个好的库中。请参阅维基百科文章中的“潜在偏见来源”部分。

答案 3 :(得分:2)

很棒的问题!

我强烈反对强烈反对您使用内置于任何编程语言的random函数。这会生成不具有加密安全性的伪随机数,因此聪明的攻击者可以查看作为卡返回的数字序列并对随机数种子进行逆向工程。由此,他们可以很容易地开始预测从牌组中出来的牌。我听说过一些早期的扑克网站有这个漏洞。

对于您的应用程序,您将需要加密安全的随机数,以便攻击者无法在不破坏密码假定安全的情况下预测卡的顺序。为此,您可以使用随机硬件源或加密安全伪随机数生成器。硬件随机发生器可能很昂贵,因此加密安全的PRNG可能是一个不错的选择。

好消息是获得加密安全的PRNG非常容易。如果您采用任何安全分组密码(例如,AES或3DES)和使用随机密钥开始加密数字0,1,2,...等,则生成的序列在加密方面是安全的。也就是说,您可以使用/dev/random获取一些随机字节作为密钥,然后通过使用给定密钥的强密码按顺序加密整数来获取随机数。这是安全的,直到你回到大约√n数字,其中n是关键空间的大小。对于像AES-256这样的密码,在您需要重置随机密钥之前,这是2 128 值。如果你“只”想玩数十亿游戏(2 40 ),这应该不错了。

希望这有帮助!祝这个项目好运!

答案 4 :(得分:1)

你一定要阅读这个问题的答案:Understanding "randomness"

您对现有伪随机数应用多个任意转换的方法不太可能改善您的结果,实际上存在渲染较少随机数的风险。

您可以考虑使用物理派生的随机数而不是伪随机数: http://en.wikipedia.org/wiki/Hardware_random_number_generator

如果你肯定会使用伪随机数,那么你可能最好用你的操作系统的随机性设备播种,这可能包括来自磁盘寻道时间和用户IO之类的额外熵。

答案 5 :(得分:0)

实际上将随机数转换成卡片(一旦你按照其他人的建议生成随机数),你可以将最低数字映射到钻石的Ace,第二个最低的数字到2的钻石,等。

基本上你假设实际的牌有一个自然的顺序,然后你对随机数进行排序并映射到牌组。

修改

显然维基百科列出了这种方法作为Fisher-Yates algorithm的替代方法(我之前没有听说过 - 感谢Dan Dyer!)。维基百科文章中我没有想到的一件事是,如果您使用我所描述的算法,您需要确保不重复任何随机数。

答案 6 :(得分:0)

  

从/ dev / random读取字节实际上效果很好。但这仍然让我失去了如何进行转换? (假设我为52张卡读取了足够的字节数)。

转换什么?只需拿一副牌,并使用加密安全的PRNG shuffle it。这将产生具有相同概率的每张可能的牌组,任何人都无法确定接下来会出现哪些牌 - 这是你可能做的最好的牌。

请确保implement the shuffling algorithm correctly:)

答案 7 :(得分:0)

可以找到一个现成的,现成的扑克手评估员here。所有反馈都欢迎来自其中的电子邮件地址。