Fonction aléatoire en c.

Résolu
zoutai -  
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,
Voilà, je cherche à faire un générateur de phrases en C
sujet, verbe, complément formant 3 tables dans laquelle le programme "pioche" des éléments.
J'ai fait une fonction qui donne une valeur aléatoire a i, qui est ensuite appellé dans main (3 fois) pour afficher aléatoirement un sujet, un verbe, un complément.
Seulement, il me génére à chaque fois le même i pour chacun des 3 mots ! Ce que je comprend puisque j'utilise srand qui réinitialise la table de rand chaque seconde, et que mon ordinateur est bien trop rapide (on va pas s'en pleindre ! :D )
A voir également:

2 réponses

vordano Messages postés 1685 Date d'inscription   Statut Membre Dernière intervention   316
 
salut,
est ce que tu pourrais montrer ton code où tu fait l'appel a ta fonction rand pour les 3 mots
0
zoutai
 
voilà, bon ne pas faire gaffe au phrases qui sont complétement bateau !
#include <stdlib.h>
#include <time.h>
#include <stdio.h>
char *Sujet[]={"ton chien","ton pere", "un lombric", "un fou"};
char *Complement[]={"bouffe","gave", "explose", "démoli"};
char *Verbe[]={"ta grand-mere", "une salade", "le président", "un chien"};

int Aleatoire (int k){

const int MAX = 4, MIN = 0;

srand(time(NULL));
k= (rand() % (MAX - MIN + 1)) + MIN;

return k;
}


int main ( int argc, char** argv ){
int i=0, j=0, h=0;
i=Aleatoire(0);
printf("%s ", Sujet[i]);
j= Aleatoire(0);
printf("%s ", Complement[j]);
h= Aleatoire(0);
printf("%s", Verbe[h]);


return 0;
}

k vas donc prendre la valeur 1 1 1 ou 2 2 2 ou 3 3 3 ou 0 0 0
J'ai essayé de mettre une boucle qui se répète un nombre aléatoire de fois mais bon, au final le problèmme reste le même en plus compliqué...
Merci par avance
0
vordano Messages postés 1685 Date d'inscription   Statut Membre Dernière intervention   316
 
tu devrais enlever le paramètre formel int k et le déclarer dans la fonction, parce que crois que c'est ca qui fait qu'il te renvoi toujours 0 (si c'est bien cette valeur qui est renvoyé)
de plus, il n'y a pas beaucoup de choix pour le rand entre 0,1,2 et 3
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Bonjour,

@vordano,
Non non, c'est pas le k qui l'erreur. C'est parfaitement autorisé. Par contre, c'est moche ^^.

@zoutai,

srand(time(NULL));
Il vaut mieux n'appeler cette fonction qu'une seule fois. Tu la mets en début de ton main() et après c'est tout. C'est ça le responsable de tes problèmes je pense. Puisqu'il réinitialise avec la même graine à chaque fois (time(NULL)) n'aura pas eu le temps de changer.
k= (rand() % (MAX - MIN + 1)) + MIN;
C'est mieux d'utiliser la division que le modulo pour pour avoir une répartition équiprobable. Enfin ce n'est pas critique pour un programme comme le tien.
T'as inversé les verbes et compléments ;-))).

Et puis, c'est bizarre ta fonction aleatoire.
Un simple int aleatoire(void) ferait l'affaire.
Cdlt,
0
zoutai
 
Merci de vos réponses :)
Oui c'est un peu dévellopé à l'arrache, je reconnais !
Par contre si je ne l'appelle qu'une seule fois, j'aurai un k (dans main) fixé pour les 3 mots, du coup...
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Non non.
Tu mets le srand(time(NULL)); dans le main() juste après la déclaration de tes variables.
Et pour la fonction aleatoire :
int aleatoire (void) {
     return MIN+(int) ( (MAX-MIN+1.0)*rand()/(RAND_MAX+1.0));
}

Et pour appeler, la fonction dans le main() : aleatoire();
Sinon tu peux même faire plus rapide :
printf("%s %s %s.\n",sujet(aleatoire()), complement(aleatoire()), verbe(aleatoire()));

Et je le redis au cas où : change l'ordre des sujets et compléments ^^.

Cdlt,
0
zoutai
 
Merci, ça marche bien !
Bon j'ai des pointeurs qui s'enmêlent un peu les pinceau (genre il me met deux fois un sujet... alors que dans le code c'est bien écrit
printf("%s %s %s.\n", Sujet[Aleatoire()], Complement[Aleatoire()], Verbe[Aleatoire()]);
)
Mais bon je vais essayer de résoudre ce problèmme :)
Encore merci !
0