一副牌是52张。一手是52张牌中的5张(不能重复)。
代表5张牌的最小位数是多少?如何?
一手不依赖于顺序(KQ = QK)。64329 = 96432
是的,可以使用52位。那可以代表任意数量的卡牌。
给定一手牌正好是5张牌,有一种方法可以用少于52位来表示它。
一张卡可以用6位= 64表示。所以可以只用6位* 5张卡= 30位。但这将取决于订单。我可以排序,这应该可以工作。如果那行不通,请告诉我。
有没有一种方法可以使密钥达到32位或以下,而不必对5卡元组进行排序。
这是用于扑克模拟,而与仅产生一手牌相比,分类会产生很多开销。如果我有一本具有每只手的相对值的字典,则它是两个简单的查找和一个比较以比较两只手的值的比较。如果我必须先对手进行排序,那将比两次查找和比较要大。在模拟中将比较数百万。我不会从模拟中得到排序。排序并不像52 51 50 49 47之前的52 51 50 49 48那样简单。您可以使用直冲四边形....
有2598960张可能的5张牌。那就是行数。关键是5张卡。我想要一个32位或以下的卡密钥,不需要先对卡进行排序。
不能只订购尽可能多的领带。西装是锹,棍棒,钻石和心脏。7c 8c 2d 3d 4s = 7s 8s 2c 3c 4h。有很多联系。
下一步是64位,它将接受排序,而不是密钥大小的两倍。
我测试SortedSet<int> quickSort = new SortedSet<int>() { i, j, k, m, n };
了手术时间并使其加倍,但是我仍然可以这样做。
它变得更加复杂。我需要能够将船表示为五分之二(22255)。因此,对它们进行分类就可以了。我知道你会说,但这很快。是的,它既快速又琐碎,但我需要尽可能快。
C#接受的答案:
private int[] DeckXOR = new int[] {0x00000001,0x00000002,0x00000004,0x00000008,0x00000010,0x00000020,0x00000040,
0x00000080,0x00000100,0x00000200,0x00000400,0x00000800,0x00001000,0x00002000,
0x00004000,0x00008000,0x00010000,0x00020000,0x00040000,0x00080000,0x00100000,
0x00200000,0x00400000,0x00800000,0x01000000,0x02000000,0x04000000,0x07fe0000,
0x07c1f000,0x0639cc00,0x01b5aa00,0x056b5600,0x04ed6900,0x039ad500,0x0717c280,
0x049b9240,0x00dd0cc0,0x06c823c0,0x07a3ef20,0x002a72e0,0x01191f10,0x02c55870,
0x007bbe88,0x05f1b668,0x07a23418,0x0569d998,0x032ade38,0x03cde534,0x060c076a,
0x04878b06,0x069b3c05,0x054089a3};
public void PokerProB()
{
Stopwatch sw = new Stopwatch();
sw.Start();
HashSet<int> cardsXOR = new HashSet<int>();
int cardXOR;
int counter = 0;
for (int i = 51; i >= 4; i--)
{
for (int j = i - 1; j >= 3; j--)
{
for (int k = j - 1; k >= 2; k--)
{
for (int m = k - 1; m >= 1; m--)
{
for (int n = m - 1; n >= 0; n--)
{
counter++;
cardXOR = DeckXOR[i] ^ DeckXOR[j] ^ DeckXOR[k] ^ DeckXOR[m] ^ DeckXOR[n];
if (!cardsXOR.Add(cardXOR))
Debug.WriteLine("problem");
}
}
}
}
}
sw.Stop();
Debug.WriteLine("Count {0} millisec {1} ", counter.ToString("N0"), sw.ElapsedMilliseconds.ToString("N0"));
Debug.WriteLine("");
}