[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
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
					//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:

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
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.
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.
0
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
0
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
Je ne vois pas la difficulté... pour tirer 5 cartes différentes il suffit de faire:
  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.
0
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 :

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';
}

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
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).
0
up !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
up
0