Help - Search - Members - Calendar
Full Version: Génération de nombres aléatoires
Jagware > Consoles > Development
GT Turbo
Hier soir il me fallait des nombres aléatoires, une routine pour cela. J'ai essayé de bricolé un truc comme sur les micros Atari (Utilisation de registres en mouvement, adresse de décodage de l'écran, etc..) mais petit soucis, les 3/4 des registres ne sont accessibles qu'en écriture, les seules accessibles en lecture, ben la synchro est t'elle qu'ils ne sont pas si aléatoires que cela, donc je suis prèt a tout prendre.





GT :blink:
Azrael
O peut aller voir là :



http://www.iro.umontreal.ca/%7Elecuyer/myftp/streams00/c/

http://www.irisa.fr/caps/projects/hipsor/HAVEGE.html (pour les intel/athlon, interessant car utilise la mémoire volatile)



plus généralement : http://random.mat.sbg.ac.at/links/rando.html



Le plus casse pied c'est qu'en général c'est en calcul flottant... encore de la doc à déchiffrer.
GT Turbo
J'ai trouvé ceci sur l'Atari-forum (Posté par NyH) et a priori trouvé sur le net :



[code]

random32:

move.l seed(PC),D0

add.l D0,D0

bcc.s done

eori.b #$AF,D0

done:

move.l D0,seed

rts

seed:

DC.L $12345678

END




Voila la page pour les curieux



Ca me plait beaucoup, court pas de truc de zinzin !!
Azrael
Ouais, mais court dans ce cas là ça veut dire pas très efficace (scientifiquement parlant) comme générateur de nombres aléatoires.



Si ça te convient dans un premier temps on peut en rester là.



GT un gros fainéant !
GT Turbo
Azrael :


Ouais, mais court dans ce cas là ça veut dire pas très efficace (scientifiquement parlant) comme générateur de nombres aléatoires.



Si ça te convient dans un premier temps on peut en rester là.



GT un gros fainéant !





Aléatoire mon c... j'ai fait des essais pratiques, pas ca....



J'ai essayé les quelques lignes au dessus, et bien je recommandes pas.



GT Turbo ;)
SebRmv
Salut,

comme moi aussi j'ai eu besoin de faire des nombres aléatoires, je vous propose ce petit algo (ça s'appelle ranrot quelque chose)
Ca donne des résultats pas mal biggrin.gif

Pour initialiser, appeler random_init (ou mettre les graines que vous voulez dans le tableau), ensuite random_next calcule un nouvelle valeur sur 32 bits...

Enjoy!

Seb

CODE
RANDGEN_J       equ     3
RANDGEN_K       equ     7      ; k > j
RANDGEN_R       equ     5

        .text
        .68000
random_init:
        move.l  #random_seeds,a0
        move.w  VC,d1
        swap    d1
        move.w  HC,d1
        moveq   #RANDGEN_K,d0
.init_seeds:
        eor.l   #$31415926,d1
        move.l  d1,(a0)+
        ror.l   #8,d1
        ror.l   #5,d1
        move.w  VC,d2
        swap    d2
        move.w  HC,d2
        add.l   d2,d1
        dbf     d0,.init_seeds
        rts

random_next:
        move.l  #random_seeds,a0
        move.l  RANDGEN_J*4(a0),d0
        add.w   #RANDGEN_K*4,a0
        move.l  (a0),d1
        moveq   #RANDGEN_K-1,d2
.shift_seeds:
        move.l  -(a0),4(a0)
        dbf     d2,.shift_seeds
        add.l   d1,d0
        ror.l   #RANDGEN_R,d0
        move.l  d0,(a0)
        rts

        .bss
        .long
random_seeds:
        ds.l    RANDGEN_K+1
SebRmv
Je voulais juste ajouter que les valeurs initiales ne doivent pas être toutes nulles bien sur!!!
Orion_
un petit truc que j'avais converti en 68000 d'une routine en C trouvé je sais plus ou biggrin.gif
ça marchais asser bien ^^
resultat dans d0, par contre ça donne un resultat 8bits biggrin.gif
CODE
; Un VRAI random :) (pas comme celui du XBios ...)
myrand:
    move.w    seed8_1(pc),d1
    move.b    0(a0,d1.w),d0
    move.w    seed8_2(pc),d2
    add.b    0(a0,d2.w),d0
    move.b    d0,0(a0,d2.w)
    addq.b    #1,d1
    addq.b    #1,d2
    andi.b    #63,d1
    andi.b    #63,d2
    move.w    d1,seed8_1
    move.w    d2,seed8_2
    rts

seed8_1: dc.w 29
seed8_2: dc.w 63

random8:
dc.b 215,25,169,8,231,201,91,15,156,5,152,30,159,50,22,49
dc.b 28,148,157,123,58,3,156,236,46,78,50,157,186,170,233,138
dc.b 49,98,215,231,0,249,233,254,194,12,110,115,122,166,15,2,163
dc.b 237,143,30,54,5,45,199,201,106,184,136,44,175,197,11
SebRmv
Alors pour renforcer encore un peu mon image de "macro man" biggrin.gif
voici le random next au gpu!!

ça complète le code 68000 que j'ai donné au-dessus

un usage typique est

gpu_random_next_init r0
gpu_random_next r0,r1,r2,r3

ici, r3 contient la nouvelle valeur pseudo aléatoire

Seb

CODE
.macro  gpu_random_next_init
       ;; \1 un registre
        movei   #random_seeds,\1
.endm

.macro  gpu_random_next
       ;; \1, \2, \3, \4 quatre registres
       ;; \1 doit pointer sur random_seeds
       ;; la macro "gpu_random_next_init \1" sert a ca!
       ;; (en fin de macro, il pointe encore la)
       ;; initialiser avec "gpu_random_next_init \1"
       ;; le nouveau nombre pseudo-aleatoire est dans \4
        addq    #RANDGEN_J*4,\1
        moveq   #RANDGEN_K,\2
        load    (\1),\4
        addq    #(RANDGEN_K-RANDGEN_J)*4,\1
        load    (\1),\3
        subq    #4,\1
        add     \3,\4
.copy_seeds_\~:
        load    (\1),\3
        addq    #4,\1
        store   \3,(\1)
        subq    #1,\2
        jr      ne,.copy_seeds_\~
        subq    #8,\1
        rorq    #RANDGEN_R,\4
        addq    #4,\1
        store   \4,(\1)
.endm
SebRmv
ça fait un petit moment que je voulais poster une version optimisée selon les bons conseils d'Azrael
j'espère que l'attachement va marcher

(j'ai laissé la vieille version en commentaire)

Seb
GT Turbo
QUOTE (SebRmv @ 29 Apr 2006, 01:29) *
ça fait un petit moment que je voulais poster une version optimisée selon les bons conseils d'Azrael
j'espère que l'attachement va marcher

(j'ai laissé la vieille version en commentaire)

Seb


Macronator is back wacko.gif



poulpe.gif
SebRmv
QUOTE (GT Turbo @ 29 Apr 2006, 09:21) *
Macronator is back wacko.gif
poulpe.gif


Et cette fois, ça va ch.. !!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Invision Power Board © 2001-2012 Invision Power Services, Inc.