[C] Doublons avec la fonction rand()
Fermé
Asus_geek
-
13 mai 2010 à 22:51
loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017 - 17 mai 2010 à 11:30
loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017 - 17 mai 2010 à 11:30
A voir également:
- [C] Doublons avec la fonction rand()
- Fonction si et - Guide
- Supprimer les doublons excel - Guide
- Doublons photos - Guide
- Supprimer les doublons photos gratuit - Télécharger - Nettoyage
- Fonction moyenne excel - Guide
5 réponses
loupius
Messages postés
697
Date d'inscription
dimanche 1 novembre 2009
Statut
Membre
Dernière intervention
31 décembre 2017
148
Modifié par loupius le 13/05/2010 à 23:37
Modifié par loupius le 13/05/2010 à 23:37
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
loupius
Messages postés
697
Date d'inscription
dimanche 1 novembre 2009
Statut
Membre
Dernière intervention
31 décembre 2017
148
14 mai 2010 à 00:27
14 mai 2010 à 00:27
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'; }
loupius
Messages postés
697
Date d'inscription
dimanche 1 novembre 2009
Statut
Membre
Dernière intervention
31 décembre 2017
148
Modifié par loupius le 17/05/2010 à 11:32
Modifié par loupius le 17/05/2010 à 11:32
for (p=1, i=0, p++) n'est pas correct. Le compilateur doit au moins râler !
Sinon, je ne vois pas pourquoi, le bout de programme que j'ai donné ne fonctionnerait pas; il faudra toutefois s'assurer de ne pas déborder du tableau (l'exemple a été donné pour 5 cartes).
Sinon, je ne vois pas pourquoi, le bout de programme que j'ai donné ne fonctionnerait pas; il faudra toutefois s'assurer de ne pas déborder du tableau (l'exemple a été donné pour 5 cartes).
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question