Traditionnellement dans la plupart des langages (BASIC, C, FORTH, PASCAL), on utilise un générateur pseudo-aléatoire
congruentiel linéaire, mais les résultats sont plutôt peu aléatoires. En effet, il apparait des motifs réguliers quand on remplie une grille 2d (cf le
calcul de PI par Dominique), preuve d'une très forte correlations entre les valeurs successives.
En plus cet algo utilisant une multiplication 16 bits est plutôt lent sur les cpu 8 bits.
Il existe des générateurs à base de décalages et xor logiques bien plus rapides et un peu plus aléatoires (en particulier parce que la graine/état interne est sur plus de 16 bits):
https://en.wikipedia.org/wiki/Xorshift. Ceux la sont très bons et très efficaces sur les micros 8bits, par exemple sur
Z80.
Cependant comme sur 6809 la multiplication 8bitsx8bits->16bits est très rapide, j'ai un code rikiki qui sort des nombres pseudo-aléatoire de bonne facture (période de 31870):
Code : Tout sélectionner
rnd ldd #3*256+249 ; graine (ne pas changer, celle là produit une longue période)
mul ; D=A*B 8x8->16 bits. Ultra rapide sur 6809 (11 cycles)
rnd1 addd #0 ;
sta <rnd1+2
stb <rnd+1+2
rts ; Reg A écrasé. Resultat dans le reg B de 0 à 255
Malgrès l'utilisation d'une multiplication ca n'est pas un générateur linéaire congruentiel, mais un générateur adapté pour 8bits inspirés des générateurs "
multiply with carry" qui ont de meilleurs propriétés aléatoires que les générateurs linéaires congruentiels. On retrouve une version Z80 de ce genre de générateur en bas de:
http://chuntey.arjunnair.in/?cat=4
Après il faut tirer une certaines quantité variable de nombres aléatoires si on ne veut pas sans arret ressortir indéfiniment la même série de nombre à chaque fois qu'on lance le programme. Pour cela il faut une source d'entropie (nom savant pour parler de bruit aléatoire). Sur les micros 8 bits elles sont rares. Les compteurs VIDEO peuvent le faire, mais le mieux est de faire une boucle d'attente tout en demandant à l'utilisateur d'appuyer sur une touche. On profitte de cette boucle pour tirer un nouveau nb aléatoire pour rien à chaque tour. Mais comme le nb de tours dépend de la vitesse de réaction de l'utilisateur (chose très variable), cela pré-initialise les générateurs avec une graine suffisamment aléatoire en pratique.