Qu’est-ce qu’un entier aléatoire? Est-ce qu’un entier pris au hasard antre 1 et 1 000 000 est réellement représentatif d’un entier aléatoire quelconque? On s’aperçoit très vite que notre modélisation ne fait qu’approcher le modèle idéal. Bien, c’est justement sur la façon de générer le nombre aléatoire que nous allons effectuer quelques changements... Nous n’allons plus utiliser la primitive hasard mais utiliser la séquence des décimales de π. Je m’explique : les décimales de π ont toujours intrigué les mathématiciens par leur manque d’irrégularité, les chiffres de 0 à 9 semblent apparaître en quantité à peu près égales et de manière aléatoire. On ne peut prédire la prochaine décimales à l’aide des précédentes. Nous allons voir ci-après comment générer un nombre alatoire à l’aide des décimales de π. Tout d’abord, il va vous falloir récupérer les premières décimales de pi (par exemple un million).
http ://downloads.tuxfamily.org/xlogo/common/millionpi.txt |
Pour créer nos nombres aléatoires, bous prendrons des paquets de 8 chiffres dans la suite des décimales de π.
Explication, le fichier commence ainsi :
Premier nombre
Deuxième nombre
Troisième nombre338327950288419716939
etc
J’enlève le « . »du 3.14 .... qui risque de nous ennuyer quand on extraiera les décimales. Bien, tout est en place, nous créons une nouvelle procédure appelée hasardpi et modifions légèrement la procédure test
pour pgcd :a :b si (reste :a :b)=0 [retourne :b][retourne pgcd :b reste :a :b] fin pour test :essais # On ouvre un flux repéré par le chiffre 1 vers le fichier millionpi.txt # (ici, supposé être dand le répertoire courant # sinon utiliser fixerepertoire et un chemin absolu) ouvreflux 1 "millionpi.txt # Affecte à la variable ligne la première ligne du fichier millionpi.txt donne "ligne premier lisligneflux 1 # On initialise la variable compteur à 0 donne "compteur 0 repete :essais [ si 1=pgcd hasardpi 7 hasardpi 7 [donne "compteur :compteur+1] ] # On calcule la frequence donne "f :compteur/:essais # On affiche la valeur approchée de pi ecris phrase [approximation de pi:] racine (6/:f) fermeflux 1 fin pour hasardpi :n soit "nombre " repete :n [ # S’il n’y plus de caractere sur la ligne si 0=compte :ligne [donne "ligne premier lisligneflux 1] # On donne à la variable caractere la valeur du premier caractere de la ligne donne "caractere premier :ligne # puis on enleve ce premier caractere de la ligne. donne "ligne saufpremier :ligne donne "nombre mot :nombre :caractere ] retourne :nombre fin test 10 approximation de pi: 3.4641016151377544 test 100 approximation de pi: 3.1108550841912757 test 1000 approximation de pi: 3.081180112566604 test 10000 approximation de pi: 3.1403714651066386 test 70000 approximation de pi: 3.1361767950325627 |
On retrouve donc une approximation du nombre π à l’aide de ses propres décimales!
Il est encore possible d’améliorer ce programme en indiquant par exemple le temps mis pour le calcul. On rajoute
alors en première ligne de la procedure test :
donne "debut temps
On rajoute juste avant fermeflux 1 :
ecris phrase [Temps mis : ] temps - :debut