[C] Probleme pour générer un nombre aléatoire

Fermé
Cereale_killer - 3 déc. 2009 à 23:37
 Cereale_killer - 4 déc. 2009 à 01:25
Bonjour,

Après m'être arraché les cheveux pendant des heures, je ne sais plus quoi faire et j'espère que vous pourrez m'aider :

Dans le cadre de la réalisation d'un Pendu en C, je dois générer 10 fois un nombre aléatoire entre 0 et 9 qui sera à chaque fois différent des nombres déjà générés,
c'est à dire qu'au final je dois avoir les 10 chiffres : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9


J'ai donc eu l'idée de créer une chaine de 10 caractères qui se remplirait au fur et à mesure avec les nombres déjà générés. J'initialise donc les 10 premières cases d'un tableau de 11 caractères avec la valeur 11 pour etre sur que le tableau ne soit pas initialisé avec des valeurs comprises entre 0 et 9, et je remplit la dernière case avec un '/0' pour transformer le tableau en chaine de caractères.
J'ai alors utilisé la fonction strchr pour vérifier si le nombre généré est présent dans la chaine, dans ce cas là, cela signifie que ce dernier a déjà été généré et je boucle jusqu'à en trouver un qui n'est pas présent dans la chaine.

Avec cette méthode tout marchait bien sauf le nombre 0 qui ne voulait pas se générer et qui faisait figer mon programme. Après quelques essais je me suis rendu compte que la fonction strchr lisait la chaine et son /0, le 0 ne pouvait donc pas être généré car il était déjà présent dans la chaine, donc boucle infinie.

Après réflexion, j'ai rajouté une condition et j'ai dit qu'on sortait de la boucle également si la fonction strchr renvoyait l'adresse de la case contenant le '/0'
Maintenant, le 0 et les autres chiffres sont généré.

Mon problème est que depuis ce rajout, il arrive qu'un nombre déjà généré soit généré de nouveau bien que la fonction strchr me retourne la valeur 0 (qui signifie normalement que le nombre généré n'est pas présent dans la chaine) !

Et là je tourne en rond, j'ai beau me relire et réfléchir, je ne vois pas ce qui ne va pas.

J'ai fait un code qui affiche à chaque tour le nombre généré, son adresse, la valeur de strchr et liste les 11 valeurs contenu dans le tableau, mais je n'arrive pas à trouver mon erreur.
(l'appui sur n'importe quelle touche du clavier entraine la génération du nombre suivant)

Voici le code :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>


int main()
{

// Declaration des ressources

int nb_aleatoire ;
char aleatoires[11]={11,11,11,11,11,11,11,11,11,11} ; // Création d'un tableau de 11 caractères et remplissage des 10 premières cases avec la valeur 11
int i ;
int escape ;
int k=-1 ; // Variable initialisée à -1 car lors de l'entrée dans la boucle, k est incrémenté

srand(time(NULL)) ; // Utilisé pour la génération d'un nombre aléatoire

aleatoires[10]='\0' ; // Permet de transformer le tableau en chaine de caractères



// Boucle de génération d'un nombre aléatoire
do
{
k++ ;

do
{
nb_aleatoire = rand()%(10) ; // Génération d'un nombre aléatoire compris entre 0 et 9 bornes comprises
} while ((strchr(aleatoires, nb_aleatoire)!=0) && (strchr(aleatoires, nb_aleatoire)!=(&aleatoires[10]))) ;
// Boucle jusqu'à ce que le nombre n'ai jamais été déjà généré lors de l'execution du programme


// Affichage de l'adresse retournée par strchr
printf("strchr = %d", strchr(aleatoires, nb_aleatoire)) ;

// Remplit la case k du tableau avec le nombre généré, k étant incrémenté à chaque tour dans la boucle
aleatoires[k]=nb_aleatoire ;

// Affichage du nombre généré et de son adresse
printf("\n\nNombre genere : %d Adresse : %d", aleatoires[k], &aleatoires[k]) ;

// Affichage du contenu du tableau aleatoires
printf("\n\nTableau : ") ;
for(i=0 ; i<11 ; i++)
{
printf("%d ", aleatoires[i]) ;
}


printf("\n\n\n") ;

// Recommence dès que l'utilisateur presse une touche et quitte si il presse Escape
escape=getch() ;
} while(escape!=27) ; // 27 est le code ASSCI de la touche Escape


return 0;
}

Merci !
A voir également:

1 réponse

grou29 Messages postés 39 Date d'inscription mardi 27 octobre 2009 Statut Membre Dernière intervention 19 mai 2010 9
4 déc. 2009 à 00:28
tu te complique la vie:

//un tableau de 10 boolean qui correpond a chaqu'un de tes chiffres
bool sortie[10];

// initialise a false
for (int i=0; i<10; i++)
{
sortie[i]=false;
}

do
{
nb_aleatoire = rand()%(10) ; // Génération d'un nombre aléatoire compris entre 0 et 9 bornes comprises

} while (sortie[nb_aleatoire ] ==true);

sortie[nb_aleatoire ] =true;

-
Grou29
http://lienssanslien.free.fr
0
Cereale_killer
4 déc. 2009 à 01:25
Merci !
beaucoup plus simple comme ça :)
0