【问题标题】:Is MySQL's RAND() good enough for "shuffling" card decks for card games?MySQL 的 RAND() 是否足以“洗牌”纸牌游戏的牌组?
【发布时间】:2011-02-18 21:33:32
【问题描述】:

我有一个扑克和二十一点游戏,将基本牌组存储在 MySQL 数据库中。为了洗牌,我使用 ORDER BY RAND() 对桌子随机排序,然后按该顺序将卡片插入另一个桌子。使用 RAND() 会产生真实的赔率,就像玩真牌和物理洗牌一样,还是这个函数不够随机?

【问题讨论】:

    标签: mysql random probability


    【解决方案1】:

    除非你经常练习,否则用真牌洗牌并不是那么随意。很容易错误地洗牌,以至于包的顶部或底部都不能很好地洗牌。

    使用 ORDER BY RAND() 洗牌是一种合理的方法,但需要注意一些事项:

    • 如果 RAND() 生成两个完全相等的随机数,则会引入轻微偏差,因为它不会正确地将这两张牌相对于彼此洗牌。
    • RAND() 不是加密安全的。通过查看牌组中的第一张牌,熟练的攻击者可能会推断出用于洗牌的 PRNG 的内部状态,从而预测剩余的牌。
    • ORDER BY RAND() 需要 O(n log(n)) 次操作。对于 52 行的改组,它很可能具有可接受的性能,但它可能不是您想要用于改组数百万行的东西。

    出于娱乐目的,您的方法应该没问题。如果这是为了大笔资金,您可能需要使用更好的随机播放算法,例如 Fisher Yates shuffle 和加密安全的随机数生成器。

    【讨论】:

      【解决方案2】:

      供您使用:可能。

      从游戏行业的角度来看:没有。

      内华达州博彩委员会在这里监督获批游戏的几率和随机性。为此目的,消除 RE 随机发生器的可能性符合公司的利益,因此真正的游戏软件使用过期的“真正随机”种子,这些种子必须通过经过认证的方法获得(通常使用一些自然混乱的输入)。银行通常会使用类似的工具。

      如需进一步阅读,请参阅 LavaRand

      http://www.lavarand.com/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-28
        • 1970-01-01
        • 1970-01-01
        • 2018-09-11
        • 2011-03-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多