Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : RAND : éviter de sortir un nombre déjà sorti... prob ! [ Archives / Au secours ] (did2604)

lundi 8 décembre 2003 à 20:30:50 | RAND : éviter de sortir un nombre déjà sorti... prob !

did2604

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 !!!

Merci de m'aider...

lundi 8 décembre 2003 à 20:46:22 | Re : RAND : éviter de sortir un nombre déjà sorti... prob !

BruNews

Administrateur CodeS-SourceS
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...

lundi 8 décembre 2003 à 20:56:28 | Re : RAND : éviter de sortir un nombre déjà sorti... prob !

djl


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?)

lundi 8 décembre 2003 à 21:10:03 | Re : RAND : éviter de sortir un nombre déjà sorti... prob !

did2604

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.

lundi 8 décembre 2003 à 21:12:36 | Re : RAND : éviter de sortir un nombre déjà sorti... prob !

BruNews

Administrateur CodeS-SourceS
Je te donne cela dans quelques minutes.
BruNews, ciao...

lundi 8 décembre 2003 à 21:19:19 | Re : RAND : éviter de sortir un nombre déjà sorti... prob !

djl


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 ;)

lundi 8 décembre 2003 à 21:21:26 | Re : RAND : éviter de sortir un nombre déjà sorti... prob !

BruNews

Administrateur CodeS-SourceS
#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...

lundi 8 décembre 2003 à 21:24:57 | Re : RAND : éviter de sortir un nombre déjà sorti... prob !

djl


scuz BruNews, j'avais pas vu que t'allai repondre

lundi 8 décembre 2003 à 21:29:36 | Re : RAND : éviter de sortir un nombre déjà sorti... prob !

BruNews

Administrateur CodeS-SourceS
2 reponses justes ne nuisent pas.
BruNews, ciao...

lundi 8 décembre 2003 à 21:31:42 | Re : RAND : éviter de sortir un nombre déjà sorti... prob !

did2604

Merci aux deux pour les réponses ;)
@+++


1 2

Cette discussion est classé dans : boucle, nombre, printf, while, rand


Répondre à ce message

Sujets en rapport avec ce message

problème avec rand() [ par ganner ] BonsoirJ'utilise cette boucle dans mon programme pour pouvoir obtenir un nombre aléatoire:while (nbRand 400)    {        nbRand = Code qui ne marche pas [ par darkwhite ] Salut a tous . Je suis debutant en C et j'ai commencé un programme qui converti un nombre binaire de huit chiffres en un nombres decimal le code est arret boucle while par clic bouton [ par julienbornet ] Bonjour, je suis entrain de programer une API. Cette api est programmer dans une dialogu box. et je chehce a arreter une boucle while lorsque l'utilis boucle qui ne fonctionne pas [ par florian1121 ] Bonjour!!J'ai un probleme au niveau de mon programme, lorsque je le lance la boucle for dans les case ,ca empeche la boucle de switch de recommencer, Recherche de caractere[Langage c] [ par mitchipecket ] Bonjour,Voilà, j'ai un petit problème. J'aimerais comparer deux mots de même nombre de lettres et afficher le nombre de lettres qui sont bien placé et la fonction while [ par romolo6 ] Bon jour à tous je commence depuis quelque jour à ecrire quelque petit code de debutant et j'essaye d'executer le suivant: #include #include main( boucle infinie, plantage du prog [ par windowsfashion ] bonjour Je suis debutant en c++  Quand je demande un nombre (avec cin) et que l'on met à la place des caracteres au lieu d'un nombre, ba sa me fait probleme de boucle... Urgent ! [ par AshenShugar ] Salut tout le monde,voila, j'ai un morceau de code qui est celui-ci :while ((Ligne 20)) { Ligne = 0; printf("\nSaisissez le nombre de lignes calcul en précision étendue [ par JesusQuintana ] Bonjours, Je veux programmer en C un ensemble complet de fonctions pour additionner, multiplier des nombres en précision étendue. Les no nombre trop grand ? [ par pandakill ] Bonjour à tous,Voila j'ai récemment fait le programme suivant en C pour résoudre une solution, et malgré tous mes efforts je ne comprends pas pourquoi


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,671 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.