12.5 Compliquons encore un peu : π qui génère π.....

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).

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 :

3◟.141◝5◜926◞ Premier nombre

                5◟3589◝7◜93◞ Deuxième nombre

                                                                                                                                    2◟3846◝2◜64◞ 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