Fonction aléatoire en c.
Résolu
zoutai
-
fiddy Messages postés 11069 Date d'inscription Statut Contributeur Dernière intervention -
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 )
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:
- Fonction aléatoire en c.
- Fonction si et - Guide
- Fonction miroir - Guide
- Fonction moyenne excel - Guide
- Tirage au sort excel aléatoire sans doublon ✓ - Forum Excel
- Fonction remplacer sur word - Guide
2 réponses
salut,
est ce que tu pourrais montrer ton code où tu fait l'appel a ta fonction rand pour les 3 mots
est ce que tu pourrais montrer ton code où tu fait l'appel a ta fonction rand pour les 3 mots
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
#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
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,
@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,
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 :
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,
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,
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 !
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 !