한 장의 카드는 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 };
작업 시간을 테스트하고 두 배로 늘 렸지만 여전히 할 수 있습니다.
더 복잡해집니다. 보트를 5 대 2 (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("");
}