编码一手 5 张牌

Encoding a hand of 5 cards

这更像是一种思维练习。假设您发了一手 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 位的进程?

您可以使用混合基数表示法。

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

(每个卡号都是 "left over" 牌组中的索引,因此可能需要进一步解码)

hand 的值是 0 到 51 + 52 * (50 + 51 * (49 + 50 * (48 + 49 * 47))) = 311875199 之间的任何值,因此 311875200 个不同的值,正是它应该的值。 这当然略多于 28 位,将解码函数的输入值限制为 268435455 或更少将 "chop off" 一组特定且可预测的手牌,但不会产生重复。