Un p’tit bout de code random svp ?
9 sujets de 16 à 24 (sur un total de 24)
- 1
- 2
-
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() >> & 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.
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.
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 ?
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 ?