• Aucun résultat trouvé

Simuler l’al´eatoire Licence 1 MASS, parcours SEMS et ESD Introduction `a Java et `a l’algorithmique

N/A
N/A
Protected

Academic year: 2022

Partager "Simuler l’al´eatoire Licence 1 MASS, parcours SEMS et ESD Introduction `a Java et `a l’algorithmique"

Copied!
29
0
0

Texte intégral

(1)

Licence 1 MASS, parcours SEMS et ESD Introduction `a Java et `a l’algorithmique

S´ebastien Verel [email protected]

http://www.i3s.unice.fr/verel

´Equipe ScoBi - Universit´e Nice Sophia Antipolis

15 mars 2013

(2)

Synth` ese

El`eves pour la synth`ese du jour ?

(3)

Objectifs de la s´ eance 6

Faire la diff´erence entre al´eatoire et pseudo-al´eatoire

Simuler un nombre pseudo-al´eatoire entier ou flottant entre 2 bornes donn´ees

Ecrire un algorithme utilisant un g´en´erateur pseudo-al´eatoire Ecrire un algorithme qui g´en`ere des s´eries temporelles du type ut+1 =aut+b+et ut+1 = (a+)ut+b

Question principale du jour :

Comment g´en´erer une s´erie de nombres qui ont l’air d’ˆetre al´eatoires ?

(4)

Plan

1 Introduction

2 G´en´erateurs pseudo-al´eatoire

3 Algorithmes stochastiques

(5)

Aiguille de Buffon

Exp´erience

Lancern fois une aiguille de longueur 2l sur parquet dont les lames sont de largeur 2a.

Soitpnle nombre de fois que l’aiguille intercepte une lame de parquet.

La fr´equence pnn permet d’approximer le nombreπ.

limn→∞

pn n = 2l

→`a partir d’´ev´enements al´eatoires, il est possible d’approximer une valeur

(6)

Besoin de nombres al´ eatoires

Simulation :

Mod`ele ´economique, sociologique, physique, m´edicale, ...

Cryptographie :

G´en´eration sˆure de cl´es de chiffrement Optimisation stochastique :

m´ethodes de MonteCarlo, recuit simul´e, algorithmes g´en´etiques, Paritcules Swarm Optimisation...

Jeux de hasard : Loto, suduko, ...

Besoin croissant de nombres al´eatoires en particulier en simulation et en cryptographie

(7)

Probl` eme de g´ en´ eration

M´ethodes principales de g´en´erateurs de nombres al´eatoires : A l’aide d’un syst`eme physique dont l’´etat est al´eatoire : Valeur pr´ecise d’une r´esistance, apparition des taches solaires, vibration de mati`ere...

→ bonne m´ethode mais lente A l’aide d’un ordinateur :

Mais un ordinateur est une machined´eterministe:

tout ´etat prochain est une fonction (image unique) des ´etats pr´ec`edents de la machine.

→ rapide, facile `a utiliser dans un ordinateur

→ mais PAS al´eatoire du tout...

Depuis peu : combinaison des deux

(8)

Technique de g´ en´ eration : le pseudo-al´ eatoire

2 ´etapes :

Initialisation d’un premier nombre appel´egraine : u0

G´en´eration d’une suite de nombres d´efinie par r´ecurrence : un+1 =f(un)

3402093,56,125672,10048,678089, ...

(9)

Limite des machines : le pseudo-al´ eatoire

Mais :

Taille de m´emoire limit´ee

Nombre de registres de calcul d’un processeur limit´e

→in´evitablep´eriodicit´edes nombres g´en´er´es pseudo-al´eatoirement par ordinateur

La suite des nombres doit avoir certaines propri´et´es de l’al´eatoire

→ g´en´erateur pseudo-al´eatoire

(10)

Petit historique

D´eveloppement essentiellement dˆu au besoin en simulation et cryptographie.

1946 : John Von Neumann, g´en´erateur Middle square 1948 : D. H. Lehmer, g´en´erateur congruenciel

1958 : G.T. Mitchell, et D.P. Moore, am´ealioration 1997 : Makoto Matsumoto et Takuji Nishimura : Mersenne-Twister

(11)

Algorithme de Von Neumann

Middle Square

Principe : pour calculer le nombre suivant, on ´el`eve au carr´e le nombre pr´ec`edent puis on conserve les chiffres du milieu.

Exemple :

Graine : 1111

1. 11112 = 1234321, premier nombre : 23432

2. 234322 = 549058624, deuxi`eme nombre : 4905862 3. ...

P´eriodicit´e faible

D´epend beaucoup de la graine

`

a fonctionnner sur l’ENIAC, mais tr`es vite limit´e.

(12)

M´ ethode de Von Neumann

// nombre courant pseud-aleatiore int n = 1111;

/********************************

* initialisation generateur pseudo-aleatoire de Von Neumann

*

* entree :

* graine du generateur aleatoire

*

* sortie :

* aucune

*******************************/

void randSeed(int k) { n = k;

}

(13)

M´ ethode de Von Neumann

/********************************

* generateur pseudo-aleatoire de Von Neumann

*

* entree :

* aucune

*

* sortie :

* nombre non attendu suivant

*******************************/

int rand() {

int nbChiffre = int(log(n * n) / log(10));

n = (n * n) % int(exp(nbChiffre * log(10))) / 10;

return n;

}

void setup() { randSeed(1111);

println(rand());

println(rand());

}

(14)

M´ ethode de Fibonacci

Bas´e sur la suite de Fibonacci et l’arithm´etique modulaire.

xn= (xn−1+xn−2) modM avecx0 et x1 comme graines

Ou une variante aveck un entier.

xn= (xn−1+xn−k) modM avecx0...xk−1 comme graines

Qualit´e : d´epend dek et des nombres utilis´es pour graines Peu de consommation de ressources

(15)

M´ ethode Fibonacci

// nombres courants pseudo-aleatoires int n0 ;

int n1 ; // congruence int M = 1000;

/********************************

* generateur pseudo-aleatoire : Methode de Fibonacci

*

* entree :

* graine du generateur aleatoire

*

* sortie :

* aucune

*******************************/

void randSeed(int _n0, int _n1) { n0 = _n0;

n1 = _n1;

}

(16)

M´ ethode Fibonacci

/********************************

* generateur pseudo-aleatoire Fibonacci

*

* entree :

* aucune

*

* sortie :

* nombre non attendu suivant

*******************************/

int rand() {

int suiv = (n0 + n1) % M;

n0 = n1;

n1 = suiv;

return suiv;

}

void setup() { randSeed(23456, 9726);

println(rand());

println(rand());

}

(17)

G´ en´ erateurs congruentiels lin´ eaires

Bas´e sur les suites arithm´etiquo-g´eom´etriques et l’arithm´etique modulaire.

xn=axn−1+c modm avecx0 une graine.

P´eriode au maximumm.

m choisit de la taille des nombres en machine 232. Simple `a impl´ementer....

(18)

Methode par congruence lin´ eaire

// nombres courants pseudo-aleatoires int n ;

// congruence int M = 1000;

int a = 53;

int c = 97;

/********************************

* generateur pseudo-aleatoire basee sur la congruence

*

* entree :

* graine du generateur aleatoire

*

* sortie :

* aucune

*******************************/

void randSeed(int _n) { n = _n;

}

(19)

M´ ethode par congruence lin´ eaire

/********************************

* generateur pseudo-aleatoire base sur la congruence

*

* entree :

* aucune

*

* sortie :

* nombre non attendu suivant

*******************************/

int rand() { n = (a * n + c) % M;

return n;

}

void setup() { randSeed(23456);

println(rand());

println(rand());

}

(20)

Mersenne-twister (Makoto Matsumoto et Takuji Nishimura 1997)

Bas´e sur les nombres de Mersenne 2p−1 P´eriode 219937−1

distribution uniforme sur 623 dimensions

N’est pas un g´en´erateur adapt´e `a la cryptographie, mais tr`es utile en simulation et optimisation.

(21)

Propri´ et´ es statistiques du pseudo-al´ eatoire

Les g´en´erateurs pseudo-al´eatoires sont con¸cus pour g´en´erer des nombres selon une loi ”proche” d’une loi uniforme

U(0,maxValue−1).

Certaines propri´et´es statistiques attendues

Propri´et´e de la distribution des nombres : moments, fr´equence d’apparition des nombres, comparaison `a la loi uniforme Entropie maximale

Ind´ependance statistique des nombres de la s´erie : autocorr´elation, test spectral

(22)

G´ en´ erateur pseudo-al´ eatoires de nombres flottants

Initialisation de la graine al´eatoire randomSeed(n)

Nombre al´eatoire (float) entre 0 et b (b exclu) random(b)

Nombre al´eatoire (float) entre aet b (b exclu) random(a, b)

(23)

G´ en´ erateur pseudo-al´ eatoires de nombres entiers

Nombre al´eatoire (int) entre 0 et b−1 int(random(b))

Nombre al´eatoire (int) entre a etb−1 int(random(a, b))

(24)

Jeu o` u l’on doit deviner un nombre entre 0 et 100

/**************************************

* Organise le jeu qui consiste a deviner un nombre

*

* entree :

* - n : nombre a deviner

*

* sortie :

* - aucune

***************************************/

void deviner() { int rep;

int n = int(random(101));

rep = n - 1;

while (rep != n) {

rep = lire("Proposer un nombre entier");

if (rep < n)

println("trop petit");

else if (rep > n)

println("trop grand");

}

(25)

Simulation de lancer de fl´ echettes

/********************************

* lancer de n flechettes

*

* entree :

* n : entier, nombre de lancer

*

* sortie :

* nombre points sur n lancers

*******************************/

int lancer(int n) { int pts = 0;

float rho, theta ; for(int i = 0; i < n; i++) {

rho = random(10);

theta = random(-3.14159265358, 3.14159265358);

point(width / 2 + 10 * rho * cos(theta), height / 2 + 10 * rho * sin(theta));

pts += nbPoints(rho);

} return pts;

}

(26)

Simulation de lancer de fl´ echettes

/********************************

* compte le nombre de point en fonction de la distance au centre

*

* entree :

* rho : distance au centre

*

* sortie :

* nombre de point

*******************************/

int nbPoints(float rho) { if (rho > 10)

return 0;

else if (rho > 5)

return 3;

else if (rho > 2)

return 5;

else if (rho > 1)

return 10;

else return 20;

(27)

Simulation de marche al´ eatoire

Simulation une marche al´eatoire den pas sur l’ensemble des entiers (positifs ou n´egatif) en partant du point central.

// variable globale int x, y;

/********************************

* marche aleatoire sur Z^2

*

* entree :

* aucune

*

* sortie :

* aucune

*******************************/

void marche() {

if (int(random(2)) == 0) y++;

else y--;

if (int(random(2)) == 0) x++;

else x--;

}

(28)

Simulation de marche aleatoire

void draw() { // efface stroke(0);

point(x, y);

marche();

// affiche stroke(255);

point(x, y);

}

void setup() { size(200, 200);

background(0);

strokeWeight(20);

// position initiale y = height / 2;

x = width / 2;

frameRate(20);

}

(29)

Objectifs de la s´ eance 6

Faire la diff´erence entre al´eatoire et pseudo-al´eatoire

Simuler un nombre pseudo-al´eatoire entier ou flottant entre 2 bornes donn´ees

Ecrire un algorithme utilisant un g´en´erateur pseudo-al´eatoire Ecrire un algorithme qui g´en`ere des s´eries temporelles du type ut+1 =aut+b+et ut+1 = (a+)ut+b

Question principale du jour :

Comment g´en´erer une s´erie de nombres qui ont l’air d’ˆetre al´eatoires ?

Références

Documents relatifs

Le logiciel Scilab, contraction de Scientific Laboratory, est un logiciel open source gratuit de calcul num´ erique, d´ evelopp´ e par le consortium Scilab.. Il est actuellement

Cr´ eer un code Scilab permettant de simuler des trajectoires d’une marche al´ eatoire en environnement al´ eatoire et d’illustrer les convergences dans les diff´ erentes

lois discr` etes, esp´ erance, fonctions g´ en´ eratrices loi et esp´ erance conditionnelle pour des lois discr` etes Le¸ con 2 : Probabilit´ es et variables al´ eatoires r´

lorsque bool´ een1 est vrai, la partie a s’ex´ ecute (quelque soit la valeur de bool´ een2 ) lorsque bool´ een1 est faux et que bool´ een2 est vrai, la partie b s’ex´ ecute.

si b est VRAI, alors ”morceau d’algorithme” est ex´ ecut´ e si b est FAUX, alors ”morceau d’algorithme” n’est pas ex´ ecut´ e, l’algorithme continue apr` es ”fin

valeurs initiales des variables en param` etre : celles donn´ ees effectivement en ex´ ecutant l’algorithme (passage par valeur) impossible de modifier la valeur d’une variable

les [] : indique que la variable est de type tableau Toutes les valeurs des cases du tableau sont donn´ ees en

Savoir utiliser un h´ eritage simple entre classes en Processing Savoir utiliser la classe ArrayList?. Comment h´ eriter sans