Se connecter / S'enregistrer
Votre question

Génaration nombre aléatoire.

Tags :
  • Time
  • Programmation
Dernière réponse : dans Programmation
8 Janvier 2012 16:37:32

Bonjour,

J'ai besoin d'une fonction pour générer un nombre aléatoire entre 1 et une valeur importante
(dans le programme en question plus de 300000)

voici la fonction en question :

  1. int num_mot(int nb_mot)
  2. {//choisi un num de mot par rapport au nb_mot
  3. int num_mot = (rand() % nb_mot) + 1;
  4. return num_mot;
  5. }


la fonction en question donc a été récupérer sur le sdz

  1. nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;


(dans mon programme time.h est bien inclus et srand(time(NULL)) au début du programme pour init le rand() )
Donc adaptée a mon programme(j'ai enlevé le -1 +1 quoi... qui si je ne trompe pas fais 0,

aucune importance que la génération des nombres soit statistiquement uniforme ou pas,
ici l'idée est simplement de générer un nombre correspondant a un numéro de mot
pour ensuite aller récupérer le mot.

donc j'envoie le nombre de mot à la fonction (soit plus de 300000)
avec l'instruction suivante pour tester :

  1. printf("%i\n",num_mot(300000));


(ici j'ai remplacé l'appelle de la fonction compte_mot par 300 000 pour tester la fonction num_mot indépendamment de l'autre.

Donc le problème, c'est qu'entre 1 et 300 000 sur 100 échantillons aucun n'est supérieur a 30 000
une partie des échantillons :


Voici le code complet :

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <assert.h>
  5.  
  6. int num_mot(int nb_mot)
  7. {//choisi un num de mot par rapport au nb_mot
  8. int num_mot = (rand() % nb_mot) + 1;
  9. return num_mot;
  10. }
  11.  
  12. int compte_mot()
  13. {//retourne nb mot dans le fichier
  14. char chara;
  15. FILE * dico;
  16. int nb_mot = 0;
  17. dico = fopen("dico.txt", "r");
  18.  
  19. fscanf(dico,"%c", &chara);
  20.  
  21. while(!feof(dico))
  22. {
  23. if(chara == '\n')
  24. nb_mot++;
  25.  
  26. fscanf(dico,"%c", &chara);
  27. }
  28.  
  29. fclose(dico);
  30.  
  31. return nb_mot+1;
  32. }
  33.  
  34. char * dico(char * pMot)
  35. {//choisi un mot dans le dico
  36. pMot = malloc(30 * sizeof(char));
  37. FILE * dico;
  38. int i;
  39.  
  40.  
  41. dico = fopen("dico.txt", "r");
  42.  
  43. for(i = nb_mot(compte_mot()); i > 0; i--)
  44. fscanf(dico,"%s", pMot);
  45.  
  46.  
  47. fclose(dico);
  48.  
  49. return pMot;
  50. }
  51.  
  52. int main()
  53. {
  54. srand(time(NULL));
  55.  
  56. /*char * pMot;*/ //pointeur servant normalement avec la fonction dico
  57. int i;
  58. printf("%i\n", comte_mot()); //pour le test indique le nombre de mot dans le fichier dico.txt
  59.  
  60. for(i =0; i < 100; i++) //tire 100 nombres aléatoires entre 1 et le nombre de mot, ici 200000 pour le test
  61. {
  62. printf("%i\n",num_mot(200000));
  63. }
  64.  
  65. return 0;
  66. }


Le problème posé : j'aimerais simplement que ma fonction rand tire des nombres dans l'intervalle que je lui impose
j'ai aussi un problème avec la fonction "dico"
y'a il un moyen d'avancer dans le fichier sans mettre chaque mot dans la variable ?

merci

Autres pages sur : genaration nombre aleatoire

a c 232 L Programmation
8 Janvier 2012 17:32:46

Salut,

Je me demande s'il y a pas un nombre maximal retourné par rand()
D'après certaines sources, ça pourrait être 32767, ce qui explique que tu n'as aucun résultat au-dessus de ce nombre (tu as un 32400 par exemple).

Tu dois pouvoir afficher le nombre maximal avec RAND_MAX
8 Janvier 2012 19:04:53

http://www.cplusplus.com/reference/clibrary/cstdlib/RAN...
En effet :D .

du coup y'a un moyen d'augmenter ce maximum ?
ou j'introduis des décimales ?

doit y'avoir un moyen d'incrémenter de 0.01 a chaque fois et de générer entre 0.01 et rand_max, là j'devrais avoir assez de marge pour tout mes mots.

J'essayerais en me replongeant dedans.

Edit : Ouais mais non... le modulo ne renvoie qu'une valeur entière non ?
Contenus similaires
a c 232 L Programmation
8 Janvier 2012 21:22:59

Oui, le modulo ne te renverra qu'une valeur entière, vu que c'est le reste de la division.

Ce que tu dois pouvoir faire sinon, c'est un calcul du genre :
  1. ((nb_mot / RAND_MAX * rand()) % nb_mot) + 1


Tu auras peut être besoin de passer le calcul en entier avant d'appliquer le modulo.
Mais ça devrait te permettre de pouvoir tirer un numéro jusqu'à ton max
a b L Programmation
10 Janvier 2012 22:03:04

Si tu veux une bonne résolution, tu peux faire ta propre fonction de tirage de nombres pseudo-aléatoires.

Les mauvais générateur que l'on utilise partout (comme avec la fonction rand()), c'est juste un générateur congruentiel linéaire:
X(n+1) = ( a * X(n) + c ) % m

avec X(n) le nombre généré précédemment (ou le random seed fournit par la fonction srand() )
a, c et m sont des nombres fixes choisis.

Tu peux trouver des définitions sur wikipedia:
http://fr.wikipedia.org/wiki/G%C3%A9n%C3%A9rateur_congruentiel_lin%C3%A9aire
http://en.wikipedia.org/wiki/List_of_pseudorandom_number_generators#Pseudorandom_number_generators_.28PRNGs.29
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS