Math 对一手5张牌进行编码

Math 对一手5张牌进行编码,math,information-theory,Math,Information Theory,这与其说是什么,不如说是一次思维练习。假设你得到了一手5张牌,在这个练习中,它们的发牌顺序非常重要。如果我们使用52卡组,有52*51*50*49*48种可能的方法可以做到这一点。Log_2(52*51*50*49*48)~28.2位熵 我试图找出的是一种将28位转换为唯一的手的方法(没有其他28位序列可以生成相同的手,尽管在某些情况下,当过程反转时,2个或更多的手可能会生成相同的28位序列) 到目前为止,我所能做的最好的事情就是从牌组中的前32张牌中挑出一张(可以用5位表示),然后再重复4次,

这与其说是什么,不如说是一次思维练习。假设你得到了一手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
(每个卡号都是“剩余”组中的索引,因此可能需要进一步解码)

hand
的值介于0和
51+52*(50+51*(49+50*(48+49*47))=311875199之间,因此311875200个不同的值,正是它应该的值。
当然,这略多于28位,将解码函数的输入值限制在268435455或更小将“切掉”一组特定且可预测的指针,但不会产生重复