[assembleur] comment genereer un nombre aleatoire

comment genereer un nombre aleatoire [assembleur] - Programmation

Marsh Posté le 20-01-2002 à 17:11:54    

genre simplement generer 0 ou 1
thx

Reply

Marsh Posté le 20-01-2002 à 17:11:54   

Reply

Marsh Posté le 20-01-2002 à 21:21:50    

... En dos moi je lisait le contenu de la memoire video sur 1ko et je faisait des xor entre un byte et le suivant et a la fin ca onnait un truc un peu n'importe koi ...

Reply

Marsh Posté le 20-01-2002 à 21:46:45    

pour un nombre aleatoire on utilise la formule suivante:
nbalea = X * 427419669081 mod 999999999989
ou x est un nombre quelconque. En general, pour X on prend l'heure systeme (int 21h, 2Ch)
pour l'interruption :  
 
mov ah,2Ch
int 21h
;et on a en sortie :
CH = heure
CL = minutes
DH = secondes
DL = centièmes de seconde
 
Ok cette methode est un peut tordu mais est tres fiable. Elle est d'ailleur utilisé dans le logiciel de calcule formel Maple pour généré des nombres pseudo-aléatoire.
 
Pour le code assembleur exacte, je ne l'ai plus.

Reply

Marsh Posté le 23-01-2002 à 12:11:20    

ok mercci bien, mais bon en fait le prob que j'ai c'est ke je dois generer environ 100 nbres aleatoires.. et donc meme si je fais ca, ben j'aurais les memes nombres non ??
 :cry:

Reply

Marsh Posté le 23-01-2002 à 12:30:23    

non, c'est une suite en fait. tu passes à l'algo le nombre aléatoire que tu viens de générer. par ex en C (si je me souviens bien), rand = rand*n1 + n2.
 
au début du programme, rand est initialisé toujours de la même manière, avec un int hardcodé : la graine. à chaque nouvelle génération, on utilise la valeur rand précédente pour générer la nouvelle. c'est pourquoi à chaque fois que tu lances le programme, tu auras toujours les mêmes nombres 'aléatoires'. randomize (srand()) iniatilise la graine avec l'heure, histoire de générer des nombres différents.
 
donc en assembleur ça donne un truc comme ça :
 
_rand dd 457879761
 
rand:
   mov eax, [_rand]
   imul eax, 784731
   add eax, 121785
   mov [_rand], eax
   ret
 
pour initialiser la graine, tu utilises l'heure. les nombres que je file, c'est n'importe quoi, cherche voir sur le net pour des bons trucs qui donnent une bonne période (ie le nombre de tirages maximal avant de retomber sur les mêmes nombres).
 
et si tu veux un truc qui torche, tu utilises le mersenne twister : http://www.math.keio.ac.jp/~matumoto/emt.html

Reply

Marsh Posté le 23-01-2002 à 12:31:59    

et si tu veux un ensemble de définition, par ex rand = [0..15], tu copies la variable avant de l'utiliser :
 
call rand
mov eax, [_rand]
and eax, 15

Reply

Marsh Posté le 23-01-2002 à 12:36:01    

hmm, je suis même plus sûr de l'algo en fait :D
 
pour obtenir un truc encore plus tordu, tu peux utiliser ror / rol :
 
mov eax, ...
imul eax, ...
ror eax, ...
add eax, ...
ror eax, ...
mov ...

Reply

Marsh Posté le 23-01-2002 à 15:18:24    

J'ai cherché çà :
random number algorithm ASM
sur google, et j'ai trouvé çà :
http://www.programmersheaven.com/zone5/cat18/1372.htm


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 24-01-2002 à 11:52:38    

thx..

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed