Génération aléatoire

Voir le sujet précédent Voir le sujet suivant Aller en bas

Génération aléatoire

Message  PapaBango le Mer 13 Oct - 15:57

Bonjour à tous,

Je cherche un moyen de générer une chaine aléatoire depuis une table ascii.

Jusqu'à présent, la seule chose que j'ai trouvé (un exemple de Faiseur me semble-t-il...) est une génération à partir d'un GetTickCount qui récupère, si mes souvenirs sont bons, l'heure du pc en secondes et donc toujours différente.
Existe t-il une fonction qui permettrait de générer une chaîne aléatoire de n caratères, récupérés dans une table ascii préalablement créée?

Merci pour vos réponses.

PapaBango

Messages: 8
Date d'inscription: 20/05/2010

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Génération aléatoire

Message  Grincheux le Mer 13 Oct - 18:53

Il y a des tas de générateurs de nombres aléatoires, cela devrait t'aider. Autrement le GetTickCount est une bonne solution.

[url=Voir ici]http://www.masm32.com/board/index.php?topic=857.0[/url]

Grincheux

Messages: 247
Date d'inscription: 17/05/2010
Age: 52
Localisation: Mathenay (39), France

Voir le profil de l'utilisateur http://phrio.biz

Revenir en haut Aller en bas

Re: Génération aléatoire

Message  edfed le Jeu 14 Oct - 2:37

par table ascii, j'entend une valeur parmis 256, donc, un octet.

c'est plus simple.

pour generer des nombres aleatoires, il faut faire des calculs incoherents, c'est le mieu.

la graine d'un géné est initialisée par une valeur (le gettickcount dans ton cas), et ensuite, chaque iteration du calcul va generer un nombre dont la valeur aura l'air imprevisible.

je ne poste pas d'exemple car il faut quand meme faire la demarche de reflexion soi meme, c'est la meilleure maniere de comprendre.

la graine est aussi ce qu'on appele le mot de passe.
si tu utilise ta chaine de nombres aleatoires, que tu fais un XOR entre un fichier et cette chaine, tu obtient un fichier crypté.

les algorythmes de cryptage utilisent des graines pouvant aller jusqu'à beaucoup de bits, mon algo perso accepte des graines entre 1 et 10 000 octets (au delà, ça fonctionne encore, mais c'est vraiment trop lent), ce qui permet de generer un peu n'importe quoi.

j'utilise d'ailleur cet algorythme pour choisir les pieces dans un tetris. le tou initialisé non pas par gettickcount ( qui est une microsofterie) mais par RDTSC qui est une instruction assembleur pour obtenir le compteur de cycles d'horloge du CPU, donc, c'est mieu, plus rapide, etc...

edfed

Messages: 44
Date d'inscription: 24/05/2010

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Génération aléatoire

Message  faiseur le Jeu 14 Oct - 12:25

C'est intéressant ce sujet. Je sais que créer un algorithme réellement aléatoire est difficile avec un CPU. L'option utilisée par Edfed est certainement plus pro. Par exemple les softs utilisés par les compagnies de logiciels de jeu (roulette et autres jeux en ligne) doivent être certifiés selon certains critères précis, mais je n'en connais pas les détails.

Concernant mon exemple, il s'agit d'un exemple utilisant des fonctions C, pour les besoins d'un tutoriel sur le sujet (ce n'est pas un tutoriel sur les randoms). Comme signalé par Grincheux, il existe plusieurs modèles utilisant des routines assembleur plutôt que des fonctions C...

La librairie Masm intègre un générateur de nombre aléatoire tout à fait bien. La fonction de la librairie s'appelle "nrandom" et s'utilise comme suit:


invoke GetTickCount
invoke nseed,eax
invoke nrandom,10


Quelques précisions:

- L'API GetTickCount est nécessaire pour générer un nombre aléatoire à chaque passe...

- "nseed" initialise le générateur avec la valeur de retour de l'API...

- "nrandom" génère un nombre aléatoire compris entre 0 et la valeur que l'on passe dans la fonction. Donc dans cet exemple: entre 0 et 9.

Il ne faut pas oublier d'ajouter la librairie masm32 dans les include et c'est tout.

include \masm32\include\masm32.inc
includelib \masm32\lib\masm32.lib


Edit: j'avais occulté ta précision sur le fait de se servir d'une table ASCII. Evidemment on peut remplacer la valeur de retour de l'API GetTickCount par cette table. Juste une précision: ne pas oublier qu'une valeur prédéterminée envoyée au générateur produira toujours la même valeur en retour.

Exemple...


invoke nseed,15
invoke nrandom,10


..produit le même résultat fixe à chaque passe.





_________________
Site perso: http://www.faiseur.net/

faiseur
Admin

Messages: 371
Date d'inscription: 02/05/2010

Voir le profil de l'utilisateur http://www.asmforum.net

Revenir en haut Aller en bas

Re: Génération aléatoire

Message  PapaBango le Jeu 14 Oct - 16:30

Merci pour ces précisions.

le lien de Grincheux concerne la génération de graphiques aléatoires...

Sinon j'ai compris le principe Smile
J'ai également retrouvé une source de SpOke qui permet de faire ce que je cherche, au final, je pense faire comme ça :

Code:
.data
Table   db   128   dup (?) ; taille de la table ascii
Buffer        dd  ?  ; buffer pour la chaine qui sera générée


.data?
Tick              dd  ?


.code
;====================================================================================
Randomize  proc  Var:DWORD  ;  procedure randomize
      push ebx
      mov eax,Var
      xor ebx,ebx
      imul edx,dword ptr ds:[ebx+Tick],08088405h
      inc edx
      mov dword ptr ds:[ebx+Tick],edx
      mul edx
      mov eax,edx
      pop ebx
      ret
Randomize EndP
;========================================================================
;==  proc qui assigne un nombre de bytes spécifique dans un emplacement memoire
;========================================================================
InitCheck  proc
      invoke GlobalAlloc,GPTR,100h
      mov SerialBuffer2,eax
      ret
InitCheck EndP
;=====================================================================
;  méthode d'appel de la
;  proc rand pour la  Génération d'1 chaine de 8 caractères par la fonction Rand
;=====================================================================
      call InitCheck
      xor eax,eax
      invoke GetTickCount
      mov Tick,eax
     
;Création de la Table Ascii
          xor eax, eax
          xor edx, edx
         .WHILE edx < 128           
         mov byte ptr [Table+edx], al 
         inc edx                   
         inc al
          .ENDW
@Loop:
      xor ecx,ecx
      mov edi,Buffer  ;Buffer de la chaine générée
  jmp @suite
  @@:
      push 080h  ;soit 128 ;Pousse sur la pile le nombre de carac de la Table ascii en Hexa
      call Randomize ; appel de la procedure randomize
      movsx eax,byte ptr ds:[eax+Table]  ;prend un des carac de la Table et le met dans eax
      mov byte ptr ds:[ecx+edi],al      ;met les carac dans un buffer ecx
      inc ecx ; incremente jusqu'au nb de carac final
  @suite:
      cmp ecx,8          ;  compare à 8 caractères pour finir la boucle
  jnz @b
;=========================================================================================== 


merci encore Smile

PapaBango

Messages: 8
Date d'inscription: 20/05/2010

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Génération aléatoire

Message  bifur le Lun 18 Oct - 11:11

pour faire du "tirage" de nombre aléatoire j'aurait mis a contribution l'uttilisateur:

une boucle infinie qui incrémente un compteur, arreté sur le signal d'une touche, on prend la valeur du compteur qui est alors un nombre aléatoire

comme on ne peut pas précisément déterminer la vitesse a laquel l'humain devant le clavier va appuyer sur le bouton (avec en plus le temps de réponse de l'électronique de la machine et la charge du système d'exploitation) ça me semble le meilleur moyen d'avoir de l'aléatoire

par contre si c'est pour determiner 256 valeur ça devient vite chiant (ou alors remplacer le bouton par un autre évenement réelement imprévisible)

bifur

Messages: 54
Date d'inscription: 21/05/2010

Voir le profil de l'utilisateur http://bofur.olympe-network.com

Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut

- Sujets similaires

Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum