【问题标题】:Encoding a hand of 5 cards编码一手 5 张牌
【发布时间】:2019-08-15 19:52:37
【问题描述】:
这更像是一种思想练习。想象一下,你拿到了一手 5 张牌,在这个练习中,发牌的顺序很重要。如果我们使用 52 张卡片组,则有 52*51*50*49*48 种可能的方法可以做到这一点。 Log_2(52*51*50*49*48) ~ 28.2 位熵。
我想弄清楚的是一种将 28 位转换为唯一手的方法(没有其他 28 位序列可以生成相同的手,尽管在某些情况下,2 个或更多手可能会生成相同的 28 位当过程颠倒时的顺序)。
到目前为止,我能做的最好的事情是挑选并移除牌组中前 32 张牌中的一张(可以用 5 位表示),然后再重复 4 次以提供 4 多张牌和 20 位以上的位。但这只给出了 25 位。谁能想到一个可以提供 28 位或至少超过 25 位的进程?
【问题讨论】:
标签:
math
information-theory
【解决方案1】:
您可以使用混合基数表示。
hand = card1 + 52 * (card2 + 51 * (card3 + 50 * (card4 + 49 * card5)))
哪些是可解码的:
card1 = hand % 52
card2 = (hand / 52) % 51
card3 = ((hand / 52) / 51) % 50
card4 = (((hand / 52) / 51) / 50) % 49
card5 = (((hand / 52) / 51) / 50) / 49
(卡号都是“剩余”牌组中的索引,因此可能需要进一步解码)
hand 的值介于 0 和 51 + 52 * (50 + 51 * (49 + 50 * (48 + 49 * 47))) = 311875199 之间,因此有 311875200 个不同的值,这正是它应该的值。
当然,这略大于 28 位,将解码函数的输入值限制为 268435455 或更少会“砍掉”一组特定且可预测的牌组,但不会导致重复。