カードのデッキは52です。手札は52枚の5枚のカードです(重複はできません)。
5カードのハンドを表すための最小ビット数はどれくらいですか?
ハンドは順序に依存しません(KQ = QK)。64329 = 96432
はい、52ビットを使用できます。それは任意の数のカードの手札を表すことができます。
ハンドがちょうど5枚のカードであるとすると、52ビット未満でそれを表す方法があります。
1枚のカードは6ビット= 64で表すことができます。したがって、6ビット* 5カード= 30ビットを使用できます。しかし、それは順序に依存します。私は単にソートすることができ、これはうまくいくはずです。うまくいかない場合はお知らせください。
32ビット以下のキーを取得し、5カードのタプルをソートする必要がない方法はありますか?
これはポーカーシミュレーション用であり、ソーティングはハンドを生成するだけの場合に比べてオーバーヘッドが大きくなります。両手の相対値を持つ辞書がある場合、それは2つの単純な検索と2つの手の値を比較する比較です。最初にハンドをソートする必要がある場合、2つのルックアップと比較と比較すると、それは大きいです。シミュレーションでは数百万を比較します。シミュレーションからソートされた手を取得しません。52 51 50 49 48の前の52 51 50 49 48のように並べ替えは単純ではありません。
2598960の可能な5カードの手があります。それが行数です。キーは5枚のカードです。カードを最初にソートする必要がない32ビット以下のキーを取得したいと考えています。
多くの人が結ぶほどリストを注文することはできません。スーツはスペード、クラブ、ダイヤ、ハートです。7c 8c 2d 3d 4s = 7s 8s 2c 3c 4h。多くの絆があります。
次のステップは64ビットで、キーのサイズを2倍にするのではなく、ソートのヒットになります。
私はテストしSortedSet<int> quickSort = new SortedSet<int>() { i, j, k, m, n };
て操作の時間を2倍にしましたが、それでも実行できます。
より複雑になります。ボートを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("");
}