RAND : éviter de sortir un nombre déjà sorti... prob !

did2604 Messages postés 29 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 19 août 2008 - 8 déc. 2003 à 20:30
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 - 8 déc. 2003 à 21:38
Bonsoir,

J'ai un problème assez spécial à vous exposer. Je me casse la tête dessus depuis 2h et pas moyen de trouver le bug. Voilà, j'utilise donc la fonction rand qui me permet de générer des nombres aléatoires (dans ce cas ci un vecteur de lettre A à F). Pour qu'une lettre ne soit pas présente 2 fois dans mon vecteur, je fais une série de while, je compte évidemment optimiser ça par la suite, mais c'est pour avoir une base. Hors, je me rends compte que des fois, ça pose problème... Le code :
____________________________________________________
char v[6]={'A','B','C','D','E','F'};
char i;
system ("CLS");
srand ((unsigned)time(NULL));
for (i=0;i<4;i++)
{
v[i]=v[rand() % 6];
}
while ((v[0]==v[1])||(v[0]==v[2])||(v[0]==v[3]))
{
printf ("%c%c%c%c",v[0],v[1],v[2],v[3]);
printf ("\ndebut boucle 0");
v[0]=v[rand()%6];
printf ("\nfin boucle 0");
}
while ((v[0]==v[1])||(v[2]==v[1])||(v[3]==v[1]))
{
printf ("%c%c%c%c",v[0],v[1],v[2],v[3]);
printf ("\ndebut boucle 1");
v[1]=v[rand()%6];
printf ("\nfin boucle 1");
}
while ((v[2]==v[0])||(v[2]==v[1])||(v[2]==v[3]))
{
printf ("%c%c%c%c",v[0],v[1],v[2],v[3]);
printf ("\ndebut boucle 2");
v[2]=v[rand()%6];
printf ("\nfin boucle 2");
}
while ((v[3]==v[0])||(v[3]==v[1])||(v[3]==v[2]))
{
printf ("%c%c%c%c",v[0],v[1],v[2],v[3]);
printf ("\ndebut boucle 3");
v[3]=v[rand()%6];
printf ("\nfin boucle 3");
}
printf ("%c%c%c%c",v[0],v[1],v[2],v[3]);
____________________________________________________
Exemple de problème : Il boucle sans fin sur "boucle1" avec les lettres AFEF ou sur la "boucle2" avec les lettres FEED ou sur la boucle 3 avec les lettres BEFF... vu le nombre de fois où il ressort un nombre aléatoire quand il entre dans sa boucle, il ne va quand-même pas trouver 500 fois le même !!! :sad)

Merci de m'aider...
A voir également:

11 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
8 déc. 2003 à 20:46
Plutot qu'un listing qui ne marche pas, donne avec PRECISION ce que tu veux et je vais finir par te l'ecrire, on va gagner du temps.
BruNews, ciao...
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
8 déc. 2003 à 20:56
tu veut prendre au hasard 4 lettre differentes dans v?
parce que si c'est ca, c'est bizar la facon dont tu t'y prend(ta deja fait de l'algo avec les tableau?)
0
did2604 Messages postés 29 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 19 août 2008
8 déc. 2003 à 21:10
Mon problème est le suivant, j'ai le code suivant mais je veux empêcher une lettre de se reproduire deux fois de suite :
___________________________________________
char v[6]={'A','B','C','D','E','F'};
char i
srand ((unsigned)time(NULL));
for (i=0;i<4;i++)
{
v[i]=v[rand() % 6];
}
___________________________________________
Merci de m'aider Brunews, mais je ne demande pas que l'on me donne un code tout fait, je veux comprendre et y arriver par moi-même. Je ne te demande pas de ton temps s'il est précieux. :shock)
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
8 déc. 2003 à 21:12
Je te donne cela dans quelques minutes.
BruNews, ciao...
0

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

Posez votre question
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
8 déc. 2003 à 21:19
char v[6]={'A','B','C','D','E','F'},tmp[4];
int i,j,unique; // unique comme bool
srand ((unsigned)time(NULL));
for (i=0;i<4;i++)
{
do{
unique=0;
tmp[i]=v[rand() % 6];
for(j=0;j<i;j++) if(tmp[j]==tmp[i]) unique=1;
}while(!unique);
}

et tu a plus qu'a afficher le contenu de tmp, si j'ai bien compris ce que tu voulais faire ;)
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
8 déc. 2003 à 21:21
#include <windows.h>

void Remplit4EntreAetF(char *pbuff)
{
int i = 1, j, v;
srand(GetTickCount());
pbuff[0] = (rand() % 6) + 'A';
while(i < 4) {
v = (rand() % 6) + 'A'; for(j 0; j < i; j++) if(pbuff[j] v) break; if(j >i) pbuff[i++] v;
}

}

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, PSTR, int)
{
char buffer[8]; // celui qui sera rempli de 4 lettres differentes
char temp[4]; // pour afficher valeurs de buffer
Remplit4EntreAetF(buffer);
temp[1] = 0;
for(int i = 0; i < 4; i++) {
temp[0] = buffer[i];
MessageBox(0, temp, "Lettre", 0);
}
return 0;
}

BruNews, ciao...
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
8 déc. 2003 à 21:24
scuz BruNews, j'avais pas vu que t'allai repondre
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
8 déc. 2003 à 21:29
2 reponses justes ne nuisent pas.
BruNews, ciao...
0
did2604 Messages postés 29 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 19 août 2008
8 déc. 2003 à 21:31
Merci aux deux pour les réponses ;)
@+++
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
8 déc. 2003 à 21:32
ohe djl, je me permets un petite remarque. Pas important ici car petite quantite mais ton algo perd des cycles pour rien, faut sortir de la boucle quand egalite trouvee.
BruNews, ciao...
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
8 déc. 2003 à 21:38
ouai exat! j'avais pas fait gaffe
0
Rejoignez-nous