Jump to content
Jagware
Sign in to follow this  
GT Turbo

Génération de nombres aléatoires

Recommended Posts

GT Turbo    5

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:

Share this post


Link to post
Share on other sites
Azrael    0

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.

Share this post


Link to post
Share on other sites
GT Turbo    5

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

Share this post


Link to post
Share on other sites
Azrael    0

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 !

Share this post


Link to post
Share on other sites
GT Turbo    5
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 ;)

Share this post


Link to post
Share on other sites
SebRmv    2

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

Share this post


Link to post
Share on other sites
SebRmv    2

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

Share this post


Link to post
Share on other sites
Orion_    1

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

Share this post


Link to post
Share on other sites
SebRmv    2

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

Share this post


Link to post
Share on other sites
SebRmv    2

ç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

Share this post


Link to post
Share on other sites
GT Turbo    5
ç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:

Share this post


Link to post
Share on other sites
SebRmv    2
Macronator is back :wacko:

:poulpe:

 

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

Share this post


Link to post
Share on other sites
Guest
You are commenting as a guest. If you have an account, please sign in.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoticons maximum are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×