Un p’tit bout de code random svp ?

9 sujets de 16 à 24 (sur un total de 24)

  • 1
  • 2
  • krabob

      #16941

      bon, assez entendu de baliverne:

      http://membres.lycos.fr/amycoders/opt/rndtut.html

      en résumé: la meilleure fonction random, c’est tout connement une fonction x = ax+b , avec a et b quelconque mais assez grand pour générer des dépassement en int.

      une suite de nombre au hazard dépend alors du premier nombre (état initial), qu’on apelle graine ( seed ).

      pour une graine identique, on a une suite identique.

      pour un hazard ou la suite généré est differente a chaque exécution, faut initialiser le seed avec un truc qui varie dans le temps: un timer par exmple.

      unsigned int seed=456;

      unsigned int hazard(void)

      {

      seed = seed * 465789195 + 4657135713 ;

      return( seed );

      }

      ensuite pour avoir [0-50] tu fais par exmple:

      n = ((( hazard() >>8) & 0x0000ffff ) *50 ) >>16)

      le premier >>8 est là parce que les bits de poid fort ont un hazard ‘mieux ventilé’. ‘& 0x0000ffff’ coupe 16 bit de poid faible (valeur [0,65535]) et ‘*50>>16’ passe en [0,50].

      voili.

      anonyme

        #16943

        9 programmeurs, 9 façon differentes de faire la même fonction :)

        c’est quand meme vachement puissant le C, puis homogéne et tout :D

        anonyme

          #16944

          Tu peux aussi faire un compteur et prendre le temps en micro secondes en guise de random…

          krabob

            #16945

            Tu peux aussi faire un compteur et prendre le temps en micro secondes en guise de random…

            … mais si tu es dans une boucle, ton random va forcément rentrer en phase avec ton timer quelque soit l’echelle de temps pasque le temps d’execution d’une passe de boucle est constante. et donc ton hazard va plus ou moins cycler sur les memes valeurs.

            Rafo

              #16946

              @Krabob:

              Oui mais bon, il demandant 50 valeurs, pas 5000. Alors bon, même s’il

              trouve 2 fois le même nombre dans la table, c’est pas la mort non

              plus. Après tout, un tirage aléatoire ne garantit pas nécessairement

              la variété des nombres.

              Même au Loto on trouve des fois de surprenantes suites de nombres.

              Petite précision : sur le Z80 y’a un registre R (Refresh) qui

              généralement sert de base pour obtenir des nombres aléatoires. Y’a pas

              un équivalent pour les autres CPU ?

              Pour le PPC, il a bien un (ou des) timer(s) intégré(s) non ? bon ben

              c’est un bon départ alors. Maintenant, pour éviter un certain cyclage

              si on est dans une boucle, suffit par exemple, au beau milieu de

              ladite boucle, de tirer à nouveau un nombre aléatoire et de faire un

              nombre de NOPs dépendant dudit nombre (pas trop non plus, histoire que

              ça prenne pas 3 heures pour construire une table de 50 numéros). Ce

              qui briserait la monotonie de la durée de la boucle.

              Non ?

              Enfin moi c’que j’en dis.

              // et Fab, aussi :) //

              Et pis bon, quand on voit la gueule du code ASM pondu par un compilo,

              ça devrait suffire à rendre la « taille » de la routine assez aléatoire.

              Vous arrivez à savoir A L’AVANCE le nombre exact d’instructions CPU

              qui seront executées pour une boucle que vous avez écrite en C, vous ?

              anonyme

                #16948

                NOP prend 9 cycles sur un 68060.

                Et une gamine de CP ne risque pas de faire du code ASM pire que celui généré par un compilo.

                Tex

                  #16949

                  mais vous etes fous de vous casser la tete pour un simple random ? :)

                  srand() puis rand() et puis c tout!

                  avec des microseconde pour la graine c’est encore mieux.

                  Rafo

                    #16950

                    Merci, Crisot !

                    anonyme

                      #16951

                      Et je pense (à vérifier) que les timers du powerpc n’offrent pas une résolution supérieure à la microseconde.

                      Bonne question :-).

                      D’apres la doc du PPC, les TB register (TimeBase) sont incrémenté a une certain fréquences, mais j’ai pas trouvé laquelle pour nos machines.

                      Imaginons que cela soit 10 Mhz.

                      10 Mhz -> tick tout les 0.1 us. Donc ca passerai.


                      @Crisot
                      : Bah, ca dépent ce que tu lui demande au compilo. Il faut être gentils avec lui et lui macher le travail ;-))

                      Bye

                    9 sujets de 16 à 24 (sur un total de 24)

                    • 1
                    • 2
                    • Vous devez être connecté pour répondre à ce sujet.

                    Forums AmigaOS, MorphOS et AROS Développement Un p’tit bout de code random svp ?

                    Amiga Impact