Jump to content

Génération de nombres aléatoires


GT Turbo

Recommended Posts

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:

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

J'ai trouvé ceci sur l'Atari-forum (Posté par NyH) et a priori trouvé sur le net :

 

 

 

 

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 !!

Link to comment
Share on other sites

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 ;)
Link to comment
Share on other sites

  • 3 months later...

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 :D

 

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

 

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

Link to comment
Share on other sites

Je voulais juste ajouter que les valeurs initiales ne doivent pas être toutes nulles bien sur!!!

Link to comment
Share on other sites

un petit truc que j'avais converti en 68000 d'une routine en C trouvé je sais plus ou :D

ça marchais asser bien ^^

resultat dans d0, par contre ça donne un resultat 8bits :D

; 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

Link to comment
Share on other sites

Alors pour renforcer encore un peu mon image de "macro man" :D

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

 

.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

Link to comment
Share on other sites

  • 1 month later...

ç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

random.zip

Link to comment
Share on other sites

ç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:

 

 

 

:poulpe:

Link to comment
Share on other sites

Macronator is back :wacko:

:poulpe:

 

Et cette fois, ça va ch.. !!

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...