Eviter doublons avec la fonction rand()

adeeldu95 Messages postés 2 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 14 mai 2010 - 13 mai 2010 à 23:24
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 - 15 mai 2010 à 15:17
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 :

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 
     
     { 
      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; p<6; 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 !

3 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
14 mai 2010 à 09:52
Une simple petite recherche sur le site t'aurais mené ici:
http://www.cppfrance.com/tutoriaux/DISTRIBUER-JEU-CARTES_924.aspx

Je pense que sa répondra parfaitement à ta question :)

_____________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
0
adeeldu95 Messages postés 2 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 14 mai 2010
14 mai 2010 à 23:40
Oui merci, mais ça "chamboule" tout mon code... j'ai découpé mon projet en plusieurs partie, j'ai essayé d'intégré le code du lien que tu ma donné mais j'arrive pas, enfaite je veux faire exactement la même chose que dans le premier tirage, j'ai essayé ça marche pas , voila le 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; p<6; p++) 
 { 
  printf("Voulez vous garder votre %de carte?\n", p); 
  scanf("%s", &choix[p-1]); 
  if (choix[p-1] == 'o' ) 
  { 
  } 
  else 
  { 
   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) 
     { 
      j = -1; 
      break; 
     } 
  if (j > 0) 
   i++; 
 } 

  } 
 } 
 choix[5] = '\0'; 
}
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
15 mai 2010 à 15:17
Je pense que sa répondra parfaitement à ta question :)

sa => ça (je devais être fatigué)

Réponse simple:
Quelque soit la méthode que tu utiliseras, la solution est simplement de garder en mémoire les cartes tirées.
Tu crées un tableau, et à chaque fois que tu tires une carte, tu regardes si la carte n'est pas dans celui-ci. Si ce n'est pas le cas, tu tires la carte et tu ajoutes la carte dans ce tableau.

_____________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
0
Rejoignez-nous