Remplir un tableau de 52 cartes à jouer aléatoirement
Fermé
georges
-
14 sept. 2014 à 14:08
KX Messages postés 16754 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 17 sept. 2014 à 18:21
KX Messages postés 16754 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 17 sept. 2014 à 18:21
A voir également:
- Algorithme jeu de carte python
- Carte d'identité - Accueil - Services publics
- 94 jeu - Télécharger - Puzzle & Réflexion
- Pile carte mere - Guide
- Jeu zuma - Télécharger - Jeux vidéo
- Citizen code python - Accueil - Outils
2 réponses
KX
Messages postés
16754
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
14 sept. 2014 à 14:22
14 sept. 2014 à 14:22
Bonjour,
Voici une idée d'algorithme :
Etape 0 : tu remplis un tableau de 52 cases avec tes 52 cartes.
Etape 1 : tu choisis un nombre aléatoirement entre 0 et 51, par exemple 12, tu permutes la carte de la case 12 avec la carte de la case 51.
Etape 2 : tu choisis un nombre aléatoirement entre 0 et 50, par exemple 36, tu permutes la carte de la case 36 avec la carte de la case 50.
Etape n : tu choisis un nombre aléatoirement entre 0 et (52-n), par exemple p, tu permutes la carte de la case p avec la carte de la case (52-n).
Etape 52 : ton tableau est mélangé.
Voici une idée d'algorithme :
Etape 0 : tu remplis un tableau de 52 cases avec tes 52 cartes.
Etape 1 : tu choisis un nombre aléatoirement entre 0 et 51, par exemple 12, tu permutes la carte de la case 12 avec la carte de la case 51.
Etape 2 : tu choisis un nombre aléatoirement entre 0 et 50, par exemple 36, tu permutes la carte de la case 36 avec la carte de la case 50.
Etape n : tu choisis un nombre aléatoirement entre 0 et (52-n), par exemple p, tu permutes la carte de la case p avec la carte de la case (52-n).
Etape 52 : ton tableau est mélangé.
Utilisateur anonyme
14 sept. 2014 à 14:16
14 sept. 2014 à 14:16
Bonjour, si tu sais manipuler les bits en C, tu peux jouer avec 52 bits (0 ou 1) pour savoir si le numéro est tiré ou non. Méthode plus simple, tenir un tableau d'entiers de 52 éléments et mettre 0 ou 1 dans l'élément correspondant. De cette façon, tu peux tester si tab[10] est égal à 1 alors la carte 11 a déjà été tirée et répéter donc l'opération pour obtenir un nouveau nombre.
KX
Messages postés
16754
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
14 sept. 2014 à 15:22
14 sept. 2014 à 15:22
Le problème avec ce genre d'algorithme c'est que tu ne sais pas combien de fois tu vas recommencer, et puisque c'est aléatoire ça peut être très grand.
Je viens de faire quelques tests et en moyenne tu vas faire 236 tirages aléatoires avant d'avoir pu obtenir chacune des 52 valeurs différentes. Mon maximum est de 1040... mais en théorie ça pourrait être infini.
Voici à quoi ressemble la courbe, en abscisse le nombre de tirages nécessaires pour obtenir 52 valeurs différentes, en ordonnées la probabilité que cela arrive (j'ai fait 10 millions d'essais)
Remarque : 52 est une valeur relativement petite, mais plus on augmente ce nombre, plus on augmente le nombre moyen de tirages aléatoires nécessaires.
Cet algorithme n'est pas vraiment le plus efficace !
Je viens de faire quelques tests et en moyenne tu vas faire 236 tirages aléatoires avant d'avoir pu obtenir chacune des 52 valeurs différentes. Mon maximum est de 1040... mais en théorie ça pourrait être infini.
Voici à quoi ressemble la courbe, en abscisse le nombre de tirages nécessaires pour obtenir 52 valeurs différentes, en ordonnées la probabilité que cela arrive (j'ai fait 10 millions d'essais)
Remarque : 52 est une valeur relativement petite, mais plus on augmente ce nombre, plus on augmente le nombre moyen de tirages aléatoires nécessaires.
Cet algorithme n'est pas vraiment le plus efficace !
17 sept. 2014 à 15:11
17 sept. 2014 à 18:21
Effectivement, quand je dis entre 0 et 51, c'est inclus (même si en pratique ce sera sûrement 52 exclu).
On pourrait bien sûr optimiser pour ne pas permuter dans le cas où la destination est identique à la source. Mais je ne sais pas ce qui est le mieux : permuter de temps en temps un pointeur pour rien, ou faire un test systématique pour savoir si on est dans le cas particulier...
Remarque : cet algorithme s'appelle Fisher-Yates Shuffle