[C] Doublons avec la fonction rand()
Asus_geek
-
loupius Messages postés 697 Date d'inscription Statut Membre Dernière intervention -
loupius Messages postés 697 Date d'inscription Statut Membre Dernière intervention -
Salut a tous,
j'ai un code qui génère des cartes de jeu (poker), aléatoirement, mais parfois j'ai des cartes en double
Pour le premier tirage tout va bien, j'ai réussi a contourner ce problème en utilisant :
ça fonctionne bien, mais pour le deuxième tirage j'ai des soucis, je sais pas comment faire, voici mon code :
Merci de m'aider !
j'ai un code qui génère des cartes de jeu (poker), aléatoirement, mais parfois j'ai des cartes en double
Pour le premier tirage tout va bien, j'ai réussi a contourner ce problème en utilisant :
void tirage1(card *main) { int i=0; int j=0; int compteur = 0; for(i=0, j = 1; i < 5; ) { main[i].color= (rand()%4) + 1; main[i].value= (rand()%13)+ 2; if (i > 0) for (j = 0; j < i ; j++) if (main[i].color == main[j].color && main[i].value == main[j].value) // contre mesure pour eviter les doublons //comparaison avec main[j] et main[i] si il trouve la meme carte il refait la boucle ;) { j = -1; break; } if (j > 0) i++; } }
ça fonctionne bien, mais pour le deuxième tirage j'ai des soucis, je sais pas comment faire, voici mon code :
void tirage2(card *main) { int p=0; int i=0; int j=1; char choix[6]; printf("Appuyez sur o pour garder ou n pour retirer\n\n"); for (p=1, i=0, j = 1; p<6,i < 5; p++) { printf("Voulez vous garder votre %de carte?\n", p); scanf("%s", &choix[p-1]); if (choix[p-1] == 'o' ) { } else { main[p-1].color= (rand()%4) + 1; main[p-1].value= (rand()%13)+ 2; } } choix[5] = '\0'; }
Merci de m'aider !
A voir également:
- [C] Doublons avec la fonction rand()
- Fonction si et - Guide
- Doublons photos - Guide
- Fonction miroir - Guide
- Supprimer les doublons excel - Guide
- Fonction moyenne excel - Guide
5 réponses
Pour ne pas avoir de doublon, la solution est assez simple.
Sur cet exemple, on peut très facilement opter pour une stratégie beaucoup plus simpliste et surtout beaucoup plus efficace que celle utilisée. En effet au lieu de se compliquer la vie à tirer une valeur de carte puis une couleur, on peut facilement tirer directement une carte entre 0 et 51 inclus, puis obtenir la couleur par '%13' et la couleur par '/13'.
Ceci permet en remplissant un simple tableau d'entier de connaître les cartes déjà tirées et ainsi de recommencer le tirage en cas de doublon.
Sur cet exemple, on peut très facilement opter pour une stratégie beaucoup plus simpliste et surtout beaucoup plus efficace que celle utilisée. En effet au lieu de se compliquer la vie à tirer une valeur de carte puis une couleur, on peut facilement tirer directement une carte entre 0 et 51 inclus, puis obtenir la couleur par '%13' et la couleur par '/13'.
Ceci permet en remplissant un simple tableau d'entier de connaître les cartes déjà tirées et ainsi de recommencer le tirage en cas de doublon.
int tableau[5]; int nbCarte = 0; int nouvelleCarte() { int i, nouvelleCarte; while (1) { nouvelleCarte = rand()%52; for (i=0; i<nbCarte; i++) if (nouvelleCarte == tableau[i]) break; if (i == nbCarte) break; } tableau[nbCarte++] = nouvelleCarte; return (nouvelleCarte); }Bonne continuation.
le problème c'est que je vais devoir modifier tout mon programme si je fais ce que tu dis...
j'aimerais une contre mesure inspiré du premier tirage, mais j'arrive pas a la mettre en place.
Merci d'avance
j'aimerais une contre mesure inspiré du premier tirage, mais j'arrive pas a la mettre en place.
Merci d'avance
Je ne vois pas la difficulté... pour tirer 5 cartes différentes il suffit de faire:
D'autre part, un 'for (p=1, i=0, j = 1; p<6,i < 5; p++)', me parait curieux dans sa formulation.
Bonne continuation.
for(i=0; i<5; i++) { int carte = nouvelleCarte(); main[i].color = carte/13; main[i].value = carte%13; }Enfin,c'est vous qui voyez !
D'autre part, un 'for (p=1, i=0, j = 1; p<6,i < 5; p++)', me parait curieux dans sa formulation.
Bonne continuation.
Lors du second tirage si je prend votre code ça ne fonctionne pas, ça ne fonctionne que pour le premier,
je précise que j'ai bien mis ça avant :
je précise que j'ai bien mis ça avant :
int tableau[5]; int nbCarte = 0; int nouvelleCarte() { int i, nouvelleCarte; while (1) { nouvelleCarte = rand()%52; for (i=0; i<nbCarte; i++) if (nouvelleCarte == tableau[i]) break; if (i == nbCarte) break; } tableau[nbCarte++] = nouvelleCarte; return (nouvelleCarte); }
void tirage2(card *main) { int p=0; int i=0; char choix[6]; printf("Appuyez sur o pour garder ou n pour retirer\n\n"); for (p=1, i=0, p++) { printf("Voulez vous garder votre %de carte?\n", p); scanf("%s", &choix[p-1]); if (choix[p-1] == 'o' ) { } else { for(i=0; i<5; i++) { int carte = nouvelleCarte(); main[i].color = carte/13; main[i].value = carte%13; } } } choix[5] = '\0'; }
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question