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