MySQL的RAND()是否适合用于卡片游戏的"洗牌"卡片?

Jam*_*son 2 mysql random probability

我有一个扑克和二十一点游戏,在MySQL数据库中存储一个基卡牌.为了洗牌,我使用ORDER BY RAND()随机订购表格,然后将卡片按顺序插入另一张表格中.使用RAND()会导致玩真实牌和物理混乱的现实赔率,还是这个功能不够随机?

Mar*_*ers 5

除非你经常练习,否则用真实卡片洗牌并不是那么随意.不正确地进行洗牌很容易,因此包装的顶部或底部没有很好地洗牌.

使用ORDER BY RAND()进行混洗是一种合理的方法,但有一些事情需要注意:

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

出于娱乐目的,您的方法应该没问题.如果这是为了赚钱,你可能想要使用更好的shuffle算法,例如Fisher Yates shuffle和加密安全的随机数生成器.