TD: Générateur pseudo

Transcription

TD: Générateur pseudo
TD: Générateur pseudo-aléatoire
1 Position du problème
Une méthode classique pour générer une suite
aléatoire
{r1 , r2 , . . . , rk } avec ri ∈ [0, M −1] consiste à utiliser
la relation de récurrence suivante: ri = reste
a.ri−1 +c
M
où a et c sont des constantes. On initialise cette suite
en choisissant r1 et on obtient une séquence périodique (de n ≤ M termes) qui se répète à l’infini. On a donc
intérêt à choisir a et M grands (par exemple 231 ' 2.109 pour une machine 32-bits) pour éviter les répétitions.
(Si un programme nécessite, au total, plus de M tirages au sort, il faudra réinitialiser la suite au cours du
calcul).
On peut tester le caractère aléatoire de la suite en traçant, sur un graphique à deux dimensions, les points
de coordoonées (xi , yi ) = (r2.i−1 , r2.i ). Le cortex étant particulièrement doué pour reconnaı̂tre les formes (à la
différence de l’ordinateur), il est facile de voir si la suite est aléatoire.
1. Écrire un programme générant la suite (ri ) avec: a = 57, c = 1, M = 256 et r1 = 10.
2. Déterminer la période de la séquence. Visualiser l’ensemble des points tels que (xi , yi ) = (r2.i−1 , r2.i ) pour
voir si la suite est aléatoire.
3. Reprendre les mêmes questions avec M = 248 , c = 11, a = 25 214 903 917.
2 Code avec Mathematica
Générateur pseudo-aléatoire
In[1]:= Genere[a ,c ,M ,initialisation ]:=(
ListePoints={};y=initialisation;i=1;Periode=0;
While[(Periode==0 && i<300),
x=Mod[a y+c,M]; If[x==initialisation,Periode=i,i++];
y=Mod[a x+c,M]; If[y==initialisation,Periode=i,i++];
ListePoints=Prepend[ListePoints,{x/M,y/M}];]
If[Periode!=0,Print["Periode:",Periode],Print["Periode>",i]];ListPlot[ListePoints]);
Genere[57,1,256,10];
Periode:256
1
ISEN-Brest. Kany.
TD: Générateur pseudo-aléatoire
In[4]:= Genere[25214903917,11,2^(48),10];
Periode>301
3 Code Python
import matplotlib.pyplot as plt
1.0
0.8
0.6
0.4
0.2
0.00.0
0.2
0.4
0.6
0.8
1.0
0.2
0.4
0.6
0.8
1.0
1.0
0.8
0.6
0.4
0.2
0.00.0
2