Un jeu de cartes est 52. Une main est 5 cartes des 52 (ne peut pas avoir de doublon).
Quel est le moins de bits pour représenter une main de 5 cartes et comment?
Une main NE dépend PAS de l'ordre (KQ = QK). 64329 = 96432
Oui, peut utiliser 52 bits. Cela peut représenter une main de n'importe quel nombre de cartes.
Étant donné qu'une main représente exactement 5 cartes, existe-t-il un moyen de la représenter avec moins de 52 bits.
Une seule carte peut être représentée avec 6 bits = 64. Il pourrait donc simplement utiliser 6 bits * 5 cartes = 30 bits. Mais cela dépendrait de l'ordre. Je pourrais simplement trier et cela devrait fonctionner. Si cela ne fonctionne pas, faites-le moi savoir.
Existe-t-il un moyen d'obtenir la clé à 32 bits ou moins et de ne pas avoir à trier le tuple à 5 cartes.
C'est pour les simulations de poker et le tri serait beaucoup plus lourd que de simplement générer la main. Si j'ai un dictionnaire avec la valeur relative de chaque main, il s'agit de deux recherches simples et d'une comparaison pour comparer la valeur de deux mains. Si je dois d'abord trier les mains, c'est grand par rapport à deux recherches et une comparaison. Dans une simulation va comparer des millions. Je n'obtiendrai pas les mains triées de la simulation. Le tri n'est pas simple comme 52 51 50 49 48 avant 52 51 50 49 47. Vous pouvez avoir des quads affleurants droits ....
Il y a 2598960 mains de 5 cartes possibles. C'est le nombre de lignes. La clé est les 5 cartes. Je voudrais obtenir une clé de 32 bits ou moins où les cartes n'ont pas besoin d'être triées en premier.
Ne peut pas simplement commander la liste car de nombreuses mains sont nouées. Le costume est la pelle, le club, le diamant et le cœur. 7c 8c 2d 3d 4s = 7s 8s 2c 3c 4h. Il y a un grand nombre de liens.
La prochaine étape est de 64 bits et prendra le coup du tri plutôt que de doubler la taille de la clé.
J'ai testé et SortedSet<int> quickSort = new SortedSet<int>() { i, j, k, m, n };
double le temps de l'opération mais je peux quand même le faire.
Cela devient plus complexe. J'ai besoin de pouvoir représenter un bateau à deux sur cinq (22255). Donc, les trier les rompt. Je sais que tu vas dire mais c'est rapide. Oui c'est rapide et trivial mais j'ai besoin le plus vite possible.
C # pour la réponse acceptée:
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("");
}