Un mazzo di carte è 52. Una mano è di 5 carte dal 52 (non può avere un duplicato).
Qual è la quantità minima di bit per rappresentare una mano di 5 carte e come?
Una mano NON dipende dall'ordine (KQ = QK). 64329 = 96432
Sì, può usare 52 bit. Ciò può rappresentare una mano di qualsiasi numero di carte.
Dato che una mano è esattamente 5 carte c'è un modo per rappresentarla con meno di 52 bit.
Una singola carta può essere rappresentata con 6 bit = 64. Quindi potrebbe usare solo 6 bit * 5 carte = 30 bit. Ma ciò dipende dall'ordine. Potrei solo ordinare e questo dovrebbe funzionare. Se ciò non funzionasse, per favore fatemi sapere.
C'è un modo per ottenere la chiave a 32 bit o meno e non è necessario ordinare la tupla a 5 carte.
Questo è per le simulazioni di poker e l'ordinamento sarebbe un sacco di spese generali rispetto al solo generare la mano. Se ho un dizionario con il valore relativo di ogni mano, sono due semplici ricerche e un confronto per confrontare il valore di due mani. Se devo prima ordinare le mani è grande rispetto a due ricerche e un confronto. In una simulazione verranno confrontati milioni. Non avrò le mani separate dalla simulazione. L'ordinamento non è semplice come 52 51 50 49 48 prima di 52 51 50 49 47. Puoi avere quadri a livello diritto ....
Ci sono 2598960 possibili 5 mani di carte. Questo è il numero di righe. La chiave è le 5 carte. Vorrei ottenere una chiave di 32 bit o inferiore in cui le carte non devono essere ordinate per prime.
Non posso semplicemente ordinare l'elenco come più mani legate. Il seme è picche, mazza, diamante e cuore. 7c 8c 2d 3d 4s = 7s 8s 2c 3c 4h. C'è un gran numero di legami.
Il passo successivo è 64 bit e prenderà il colpo dell'ordinamento anziché raddoppiare la dimensione della chiave.
Ho testato e SortedSet<int> quickSort = new SortedSet<int>() { i, j, k, m, n };
raddoppiato il tempo dell'operazione, ma posso ancora farlo.
Diventa più complesso. Devo essere in grado di rappresentare una barca come due su cinque (22255). Quindi ordinarli li rompe. So che lo dirai, ma è veloce. Sì, è veloce e banale, ma ho bisogno il più velocemente possibile.
C # per la risposta accettata:
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("");
}