Génération aléatoire
Page 1 sur 1 • Partager •
Génération aléatoire
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.
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
Re: Génération aléatoire
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]
[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

Re: Génération aléatoire
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...
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
Re: Génération aléatoire
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:
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.
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...
..produit le même résultat fixe à chaque passe.
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

Re: Génération aléatoire
Merci pour ces précisions.
le lien de Grincheux concerne la génération de graphiques aléatoires...
Sinon j'ai compris le principe
J'ai également retrouvé une source de SpOke qui permet de faire ce que je cherche, au final, je pense faire comme ça :
merci encore
le lien de Grincheux concerne la génération de graphiques aléatoires...
Sinon j'ai compris le principe
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
PapaBango- Messages: 8
Date d'inscription: 20/05/2010
Re: Génération aléatoire
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)
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

Sujets similaires» Questionnements sur des générateurs de terrains aléatoire (2D)
» Bannière Aléatoire
» Problème accélération
» [forumactif] utilisation des outils de modération
» Page html aléatoire
» Bannière Aléatoire
» Problème accélération
» [forumactif] utilisation des outils de modération
» Page html aléatoire
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum




