Simuler l`aléatoire

Transcription

Simuler l`aléatoire
Simuler l’aléatoire
Licence 1 MASS, parcours SEMS et ESD
Introduction à Java et à l’algorithmique
Sébastien Verel
[email protected]
http://www.i3s.unice.fr/∼verel
Équipe ScoBi - Université Nice Sophia Antipolis
15 mars 2013
Introduction
Générateurs pseudo-aléatoire
Algorithmes stochastiques
Synthèse
Elèves pour la synthèse du jour ?
Sébastien Verel
Simuler l’aléatoire
Introduction
Générateurs pseudo-aléatoire
Algorithmes stochastiques
Objectifs de la séance 6
Faire la différence entre aléatoire et pseudo-aléatoire
Simuler un nombre pseudo-aléatoire entier ou flottant entre 2
bornes données
Ecrire un algorithme utilisant un générateur pseudo-aléatoire
Ecrire un algorithme qui génère des séries temporelles du type
ut+1 = aut + b + et ut+1 = (a + )ut + b
Question principale du jour :
Comment générer une série de nombres qui ont l’air d’être
aléatoires ?
Sébastien Verel
Simuler l’aléatoire
Introduction
Générateurs pseudo-aléatoire
Algorithmes stochastiques
Plan
1
Introduction
2
Générateurs pseudo-aléatoire
3
Algorithmes stochastiques
Sébastien Verel
Simuler l’aléatoire
Introduction
Générateurs pseudo-aléatoire
Algorithmes stochastiques
Aiguille de Buffon
Expérience
Lancer n fois une aiguille de longueur 2l sur parquet dont les lames
sont de largeur 2a.
Soit pn le nombre de fois que l’aiguille intercepte une lame de
parquet.
La fréquence
pn
n
permet d’approximer le nombre π.
limn→∞
2l
pn
=
n
aπ
→ à partir d’événements aléatoires, il est possible d’approximer
une valeur
Sébastien Verel
Simuler l’aléatoire
Introduction
Générateurs pseudo-aléatoire
Algorithmes stochastiques
Besoin de nombres aléatoires
Simulation :
Modèle économique, sociologique, physique, médicale, ...
Cryptographie :
Génération sûre de clés de chiffrement
Optimisation stochastique :
méthodes de MonteCarlo, recuit simulé, algorithmes
génétiques, Paritcules Swarm Optimisation...
Jeux de hasard :
Loto, suduko, ...
Besoin croissant de nombres aléatoires en particulier en simulation
et en cryptographie
Sébastien Verel
Simuler l’aléatoire
Introduction
Générateurs pseudo-aléatoire
Algorithmes stochastiques
Problème de génération
Méthodes principales de générateurs de nombres aléatoires :
A l’aide d’un système physique dont l’état est aléatoire :
Valeur précise d’une résistance, apparition des taches solaires,
vibration de matière...
→ bonne méthode mais lente
A l’aide d’un ordinateur :
Mais un ordinateur est une machine déterministe :
tout état prochain est une fonction (image unique) des états
précèdents de la machine.
→ rapide, facile à utiliser dans un ordinateur
→ mais PAS aléatoire du tout...
Depuis peu : combinaison des deux
Sébastien Verel
Simuler l’aléatoire
Introduction
Générateurs pseudo-aléatoire
Algorithmes stochastiques
Technique de génération : le pseudo-aléatoire
2 étapes :
Initialisation d’un premier nombre appelé graine :
u0
Génération d’une suite de nombres définie par récurrence :
un+1 = f (un )
3402093, 56, 125672, 10048, 678089, ...
Sébastien Verel
Simuler l’aléatoire
Introduction
Générateurs pseudo-aléatoire
Algorithmes stochastiques
Limite des machines : le pseudo-aléatoire
Mais :
Taille de mémoire limitée
Nombre de registres de calcul d’un processeur limité
→ inévitable périodicité des nombres générés pseudo-aléatoirement
par ordinateur
La suite des nombres doit avoir certaines propriétés de l’aléatoire
→ générateur pseudo-aléatoire
Sébastien Verel
Simuler l’aléatoire
Introduction
Générateurs pseudo-aléatoire
Algorithmes stochastiques
Petit historique
Développement essentiellement dû au besoin en simulation et
cryptographie.
1946 : John Von Neumann, générateur Middle square
1948 : D. H. Lehmer, générateur congruenciel
1958 : G.T. Mitchell, et D.P. Moore, améalioration
1997 : Makoto Matsumoto et Takuji Nishimura :
Mersenne-Twister
Sébastien Verel
Simuler l’aléatoire
Introduction
Générateurs pseudo-aléatoire
Algorithmes stochastiques
Algorithme de Von Neumann
Middle Square
Principe : pour calculer le nombre suivant, on élève au carré le
nombre précèdent puis on conserve les chiffres du milieu.
Exemple :
Graine : 1111
1. 11112 = 1234321, premier nombre : 23432
2. 234322 = 549058624, deuxième nombre : 4905862
3. ...
Périodicité faible
Dépend beaucoup de la graine
à fonctionnner sur l’ENIAC, mais très vite limité.
Sébastien Verel
Simuler l’aléatoire
Introduction
Générateurs pseudo-aléatoire
Algorithmes stochastiques
Méthode 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;
}
Sébastien Verel
Simuler l’aléatoire
Introduction
Générateurs pseudo-aléatoire
Algorithmes stochastiques
Méthode 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());
}
Sébastien Verel
Simuler l’aléatoire
Introduction
Générateurs pseudo-aléatoire
Algorithmes stochastiques
Méthode de Fibonacci
Basé sur la suite de Fibonacci et l’arithmétique modulaire.
xn = (xn−1 + xn−2 ) mod M
avec x0 et x1 comme graines
Ou une variante avec k un entier.
xn = (xn−1 + xn−k ) mod M
avec x0 ... xk−1 comme graines
Qualité : dépend de k et des nombres utilisés pour graines
Peu de consommation de ressources
Simple à implémenter....
Sébastien Verel
Simuler l’aléatoire
Introduction
Générateurs pseudo-aléatoire
Algorithmes stochastiques
Méthode 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;
}
Sébastien Verel
Simuler l’aléatoire
Introduction
Générateurs pseudo-aléatoire
Algorithmes stochastiques
Méthode 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());
}
Sébastien Verel
Simuler l’aléatoire
Introduction
Générateurs pseudo-aléatoire
Algorithmes stochastiques
Générateurs congruentiels linéaires
Basé sur les suites arithmétiquo-géométriques et l’arithmétique
modulaire.
xn = axn−1 + c mod m
avec x0 une graine.
Période au maximum m.
m choisit de la taille des nombres en machine 232 .
Simple à implémenter....
Sébastien Verel
Simuler l’aléatoire
Introduction
Générateurs pseudo-aléatoire
Algorithmes stochastiques
Methode par congruence linéaire
// 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;
}
Sébastien Verel
Simuler l’aléatoire
Introduction
Générateurs pseudo-aléatoire
Algorithmes stochastiques
Méthode par congruence linéaire
/********************************
* 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());
}
Sébastien Verel
Simuler l’aléatoire
Introduction
Générateurs pseudo-aléatoire
Algorithmes stochastiques
Mersenne-twister (Makoto Matsumoto et Takuji Nishimura
1997)
Basé sur les nombres de Mersenne 2p − 1
Période 219937 − 1
distribution uniforme sur 623 dimensions
N’est pas un générateur adapté à la cryptographie, mais très
utile en simulation et optimisation.
Sébastien Verel
Simuler l’aléatoire
Introduction
Générateurs pseudo-aléatoire
Algorithmes stochastiques
Propriétés statistiques du pseudo-aléatoire
Les générateurs pseudo-aléatoires sont conçus pour générer des
nombres selon une loi ”proche” d’une loi uniforme
U(0, maxValue − 1).
Certaines propriétés statistiques attendues
Propriété de la distribution des nombres : moments, fréquence
d’apparition des nombres, comparaison à la loi uniforme
Entropie maximale
Indépendance statistique des nombres de la série :
autocorrélation, test spectral
Sébastien Verel
Simuler l’aléatoire
Introduction
Générateurs pseudo-aléatoire
Algorithmes stochastiques
Générateur pseudo-aléatoires de nombres flottants
Initialisation de la graine aléatoire
randomSeed(n)
Nombre aléatoire (float) entre 0 et b (b exclu)
random(b)
Nombre aléatoire (float) entre a et b (b exclu)
random(a, b)
Sébastien Verel
Simuler l’aléatoire
Introduction
Générateurs pseudo-aléatoire
Algorithmes stochastiques
Générateur pseudo-aléatoires de nombres entiers
Nombre aléatoire (int) entre 0 et b − 1
int(random(b))
Nombre aléatoire (int) entre a et b − 1
int(random(a, b))
Sébastien Verel
Simuler l’aléatoire
Introduction
Générateurs pseudo-aléatoire
Algorithmes stochastiques
Jeu où 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");
}
println("Winner is back !");
}
Sébastien Verel
Simuler l’aléatoire
Introduction
Générateurs pseudo-aléatoire
Algorithmes stochastiques
Simulation de lancer de fléchettes
/********************************
* 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;
}
Sébastien Verel
Simuler l’aléatoire
Introduction
Générateurs pseudo-aléatoire
Algorithmes stochastiques
Simulation de lancer de fléchettes
/********************************
* 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;
}
Sébastien Verel
Simuler l’aléatoire
Introduction
Générateurs pseudo-aléatoire
Algorithmes stochastiques
Simulation de marche aléatoire
Simulation une marche aléatoire de n pas sur l’ensemble des
entiers (positifs ou négatif) 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--;
}
Sébastien Verel
Simuler l’aléatoire
Introduction
Générateurs pseudo-aléatoire
Algorithmes stochastiques
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);
}
Sébastien Verel
Simuler l’aléatoire
Introduction
Générateurs pseudo-aléatoire
Algorithmes stochastiques
Objectifs de la séance 6
Faire la différence entre aléatoire et pseudo-aléatoire
Simuler un nombre pseudo-aléatoire entier ou flottant entre 2
bornes données
Ecrire un algorithme utilisant un générateur pseudo-aléatoire
Ecrire un algorithme qui génère des séries temporelles du type
ut+1 = aut + b + et ut+1 = (a + )ut + b
Question principale du jour :
Comment générer une série de nombres qui ont l’air d’être
aléatoires ?
Sébastien Verel
Simuler l’aléatoire