mysql - MySQL 的 RAND() 是否足够适合纸牌游戏的 "shuffling"纸牌组?

标签 mysql random probability

我有一个扑克和二十一点游戏,它在 MySQL 数据库中存储一组基本牌。为了洗牌,我使用 ORDER BY RAND() 对表进行随机排序,并按该顺序将牌插入到另一个表中。使用 RAND() 是否会导致使用真实纸牌和物理洗牌时出现的实际赔率,或者这个函数不够随机?

最佳答案

除非你经常练习,否则用真牌洗牌并不是那么随机。很容易错误地洗牌,导致牌包的顶部或底部洗牌效果不佳。

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

  • 如果 RAND() 生成两个完全相等的随机数,则会产生轻微偏差,因为它不会正确地相互洗牌这两张牌。
  • RAND() 在加密上不安全。通过查看这副牌中的一些第一张牌,熟练的攻击者可能会推断出用于洗牌的 PRNG 的内部状态,从而预测剩余的牌。
  • ORDER BY RAND() 需要 O(n log(n)) 次操作。它很可能在打乱 52 行时具有可接受的性能,但例如,您可能不希望将其用于打乱数百万行。

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

关于mysql - MySQL 的 RAND() 是否足够适合纸牌游戏的 "shuffling"纸牌组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5046819/

相关文章:

mysql - 如果sql查询中的记录相同,如何分配相同的唯一行号?

mysql - 理解 mysql_real_escape_string();

c++ - 随机数生成器碰撞测试中的碰撞太多

c++ - 生成许多​​良好的均匀分布的随机数

javascript - 如何使用 randomBytes() 在 node.js 中生成随机 6 位密码

python - 罗莎琳德:孟德尔第一定律

mysql - 单独执行时查询速度快,嵌套时查询速度慢

mysql - 有没有办法限制表中返回唯一值的次数?

c++ - 如何计算 C++ 中正态分布的 CDF 概率?

artificial-intelligence - 聚合概率计划