Partage
  • Partager sur Facebook
  • Partager sur Twitter

Décimaux aléatoires en boucle

Sujet résolu
    13 juin 2007 à 17:12:20

    Bonjour, ayant besoin dans mon projet de générer des nombres aléatoires entre 0 et 1, je me suis penché sur le Tuto de Natim. J'ai donc récuperé son code et je l'ai modifié pour qu'il me généré des floats et je lui ai créé une classe spéciale pour lui (le chanceux), Random.cpp


    #include "Random.h"

    float Random::alea(){
      srand(time(NULL));
      float alea;
      int min = 0;
      int max = 1;
      alea = hasard(min, max);
    return alea;

    }

    float Random::hasard(int min, int max){
    return (float) (min + ((float) rand() / RAND_MAX * (max - min)));
    }


    Bon rien de très original...

    PAr contre assez intéressant, lorsque je fait appel a la fonction alea() de cette classe Random, par exemple dans mon main(), et que je récupère donc les décimaux générés en boucle, ça me donne ça

    nbreAlea = 0.958765
    Appuyez sur une touche pour continuer...
    nbreAlea = 0.958772
    Appuyez sur une touche pour continuer...
    nbreAlea = 0.958810
    Appuyez sur une touche pour continuer...
    nbreAlea = 0.958825
    Appuyez sur une touche pour continuer...


    si je patiente et donc que j'appuie sur une touche pour continuer

    nbreAlea = 0.983452
    Appuyez sur une touche pour continuer...
    nbreAlea = 0.983564
    Appuyez sur une touche pour continuer...
    nbreAlea = 0.98457
    Appuyez sur une touche pour continuer...


    et bien sûr arrive le moment où je repars du début

    nbreAlea = 0.001945
    Appuyez sur une touche pour continuer...
    nbreAlea = 0.002107


    Alors du coup évidemment c'est un peu problématique, surtout si je veux générer beaucoup de nombres dans un cours laps de temps...
    Bon c'est sûr le premier est aléatoire, mais tous les autres dépendent de celui-ci et du temps entre chaque boucle

    Du coup est-ce que quelqu'un a une idée à me soumettre pour arranger celà...??? o_O
    • Partager sur Facebook
    • Partager sur Twitter
      13 juin 2007 à 17:25:04

      Bonjour, le problème que tu a est dû à la fonction srand ...

      La fonction srand se place dans un tableau de nombres aléatoires en fonction du nombre que tu lui donne en paramètre. Si le nombre est toujours le même alors la fonction se placera toujours au même endroit dans le tableau et donc la fonction rand qui suit donnera toujours le même nombre. Or ce nombre ne change que toutes les secondes.
      Ainsi, le problème vient du fait que tu appelle en boucle la fonction srand.
      Il faudrait l'appeler au début de ton programme, c'est tout ;) .


      Amicalement, Zephyr ;) .
      • Partager sur Facebook
      • Partager sur Twitter
        13 juin 2007 à 17:56:07

        Hum hum je situe mieux le problème merci!!
        Je vais m'atteler a suivre ton conseil, mais le gros probleme c'est que j'ai besoin de générer énormément d'objets qui ont un attibut qui peut prendre deux valeurs suivant si le nombre aléatoire généré est supérieur ou inférieur à 0,5. Du coup si je fais appel à la fonction srand au début de mon programme tous mes objets vont avoir la même valeur pour leur attribut...
        Je sais pas si je suis clair...
        J'essaie d'appliquer ton conseil et je vais voir si c'est réalisable...

        Merci en tout cas d'avoir répondu si vite :D
        • Partager sur Facebook
        • Partager sur Twitter
          13 juin 2007 à 18:33:36

          Nan je croit que tu confond.

          srand sert à initialiser le générateur de nombre pseudo-aléatoire.
          rand sert à générer un nombre pseudo-aléatoire.

          Donc même si tu n'utilise srand qu'une fois, tu pourras générer autant de nombres que tu veux avec rand, ils seront tous différents (enfin pseudo-aléatoires quoi ^^ ).
          • Partager sur Facebook
          • Partager sur Twitter
            13 juin 2007 à 21:57:22

            Citation : Kevin Leonhart


            Donc même si tu n'utilise srand qu'une fois, tu pourras générer autant de nombres que tu veux avec rand, ils seront tous différents (enfin pseudo-aléatoires quoi ^^ ).


            Faut pas pousser quand même.
            Et ta fonction est limitée à max-min <32767 sous peine de buguer fortement.
            • Partager sur Facebook
            • Partager sur Twitter
              13 juin 2007 à 22:02:35

              D'où la parenthèse après.

              Citation : Pole

              Et ta fonction est limitée à max-min <32767 sous peine de buguer fortement.


              Pas forcément, a dépend du système.
              Sous windows, mon RAND_MAX était en effet de 32767.
              Mais sous (mon?) linux il est beaucoup plus grand. (j'ai plus le chiffre exact en tête.)
              • Partager sur Facebook
              • Partager sur Twitter
                13 juin 2007 à 22:04:56

                Mais si on veut être portable, il vaut mieux gérer le cas Windows.
                • Partager sur Facebook
                • Partager sur Twitter
                  14 juin 2007 à 8:50:44

                  Citation : Pole

                  Mais si on veut être portable, il vaut mieux gérer le cas Windows.


                  je pense que pour etre portable il faudrait faire un sizeof(int) pour connaitre cette valeur..
                  • Partager sur Facebook
                  • Partager sur Twitter
                    14 juin 2007 à 9:56:33

                    Mouais mouais, je vais tenter d'exposer clairement mon problème

                    Je possède (entre autres) 4 classes , Machin Bidule Truc et Chose, un objet machin étant composé de deux objets bidules, un objet truc composé de x objets machin, un objet chose composé de x objets truc.

                    Au début de mon main, l'utilisateur choisit 2 (ou plus, mais là on va limiter à 2) valeurs que les objets bidules pourront prendre pour 1 objet machin

                    Par exemple, machin1 sera être composé de deux objets bidules qui seront :
                    soit tous les deux bidule1
                    soit tous les deux bidule2
                    soit un bidule1 et un bidule2

                    Ensuite le programme crée les objets machin et donc un chiffre aléatoire est tiré pour connaître la valeur du premier objet bidule lié à ce machin et un autre chiffre aléatoire est tiré pour connaître la valeur du second objet bidule lié à ce machin
                    Cette manoeuvre est effectuée pour x objets machin, eux même composant des objets truc, qui composent les objets chose, autant dire qu'il y a de nombreuses boucles.... :-°

                    Donc si je place la fonction srand au début de mon main() j'ai toujours le même nombre aléatoire de généré, ce qui ne me convient pas du tout car tous mes bidules ont la même valeur...

                    Voilà en gros comment dois je procéder si je veux générer des nombres aléatoires en boucle??? :euh:
                    • Partager sur Facebook
                    • Partager sur Twitter
                      14 juin 2007 à 10:21:18

                      Citation : Le Petit Lémurien

                      Donc si je place la fonction srand au début de mon main() j'ai toujours le même nombre aléatoire de généré, ce qui ne me convient pas du tout car tous mes bidules ont la même valeur...


                      mékékidi ?

                      Citation : Kevin Leonhart

                      srand sert à initialiser le générateur de nombre pseudo-aléatoire.
                      rand sert à générer un nombre pseudo-aléatoire.


                      Enfin c'est dans la FAQ quoi : http://www.siteduzero.com/forum-83-125906-1138932.html#r1138932


                      Citation : seb2003

                      je pense que pour etre portable il faudrait faire un sizeof(int) pour connaitre cette valeur..


                      Si tu parle de RAND_MAX, il s'agit d'une constante définie dans le fichier "stdlib.h". ;)
                      • Partager sur Facebook
                      • Partager sur Twitter
                        14 juin 2007 à 10:39:33

                        Citation : Kevin Leonhart

                        Enfin c'est dans la FAQ quoi : http://www.siteduzero.com/forum-83-125906-1138932.html#r1138932



                        Ah bah ok là c'est plus clair!!! :D
                        J'avais pas saisi la différence
                        C'est bon maintenant ça marche nickel
                        Merci beaucoup, et désolé pour mon ignorance... :euh:
                        • Partager sur Facebook
                        • Partager sur Twitter
                          14 juin 2007 à 10:42:38

                          héhé, d'où ma signature ^^

                          EDIT : nan rien j'ai bu
                          • Partager sur Facebook
                          • Partager sur Twitter

                          Décimaux aléatoires en boucle

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                          • Editeur
                          • Markdown