Décimales aléatoires

On cherche à savoir si la suite des décimales de certains réels est aléatoire.

I) Présentation et méthode suivie

  Une suite aléatoire d'entiers est une suite ne possédant aucune structure, régularité, ou règle de prédiction identifiable. C'est une suite de nombres "au hasard".  La formalisation rigoureuse de cette idée intuitive de "hasard" est complexe.  Dans ce TP, on s'intéresse à certaines propriétés d'une suite donnée S d'entiers, avec l'idée de comparer les résultats avec ceux d'une suite aléatoire.  Les suites S que l'on étudie ici sont les listes des décimales de certains nombres réels.

  Plus précisément, étant donnée une suite S d'entiers de { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 } (les décimales d'un réel x donné), on découpera cette suite S en groupes de cinq entiers et on calculera les fréquences d'apparitions de certains groupes comprenant:
    (1) Des entiers distincts: par exemple 54287
    (2) Une paire (un entier et un seulement est répété deux fois): par exemple 01203
    (3) Deux paires (deux entiers différents sont répétés exactement deux fois): par exemple 77232
    (4) Un brelan (un entier est répété trois fois et les deux autres entiers sont différents): par exemple 84858
    (5) Un full (un brelan et une paire): par exemple 23233
    (6) Un carré (un entier et un seulement est répété exactement quatre fois): par exemple 00100
    (7) Un quinconce (les cinq entiers sont identiques): par exemple 22222
On comparera les fréquences d'apparition de ces groupes avec celles d'une liste aléatoire que l'on calcule dans le II).    

II) Calcul des fréquences pour une liste aléatoire

Q1) Un groupe de 5 entiers de { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 } est une 5-liste de { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 } . On demande des justications "dénombrement" (pas algorithmiques) dans cette question. On note f G la fréquence d'apparition moyenne d'un groupe G . Prouver qu'il y a:

     N = 10 5 groupes au total.
     D = 30240 groupes d'entiers distincts et donc que f D = 0.3024 .
     P = 50400 groupes avec une paire et donc que f P = 0.504 .
     DP = 10800 groupes avec une double paire et donc que f DP = 0.108 .
     B = 7200 groupes avec un brelan et donc que f B = 0.072 .
     F = 900 groupes avec un full  et donc que f F = 0.009 .
     C = 450 groupes avec un carré  et donc que f C = 0.0045 .
     Q = 10 groupes avec un quinconce  et donc que f Q = 0.0001 .
Vérifier que N = D + P + DP + B + F + C + Q et justifier que c'est normal.    

III) Analyse d'une liste donnée

Q2) Ecrire une fonction poker(mot) (avec mot une chaîne de caractères de 5 lettres) qui renvoie le couple d'entiers (nbRepet, nbLettreRepet) où:
    • nbRepet est le nombre total de répétitions de lettres dans mot
    • nbLettreRepet est le nombre de lettres différentes dans les répétitions
Votre fonction doit tenir en une quinzaine de lignes environ. Vérifier par exemple que:

for mot in ["54287", "01203", "77232", "84858", "23233", "00100", "22222"]:
    print(poker(mot))
# renvoie
(0, 0)(1, 1)(2, 2)(2, 1)(3, 2)(3, 1)(4, 1)

  On va analyser des listes d'au moins un million de décimales: la liste des décimales de la fraction x = 1002 1003 et la liste des décimales de y = 2 et du nombre z de Champernowne. Ces listes sont disponibles dans les fichiers textes qui sont dans le répertoire http://www.maths-algo.fr/algo/explorateur.php?dir=exercices/Recherche%20 mot  
  Le nombre z de Champernowne est z = 0.123456789101112131415 ...
  La fonction lire_fichier() suivante permet d'en récupérer le contenu une fois le fichier recopié dans le répertoire courant de travail.

def lire_fichier(nom_fichier):
    """ Texte contenu dans le fichier encodé en utf8 nom_fichier"""
# Ouverture en lecture du fichier
    with open(nom_fichier, "r", encoding = "utf8") as fich:
        return fich.read()

Q3) Ecrire une fonction analyser(nom_fichier) (avec nom_fichier de type str) qui:
    (1) Lit le contenu du fichier appelé nom_fichier
    (2) Analyse le contenu du fichier par groupes de 5 caractères en calculant le nombre de groupes distincts, de paires, de double paires, de brelans, de fulls, de carrés, de quinconces
    (3) Calcule par ailleurs les nombres ci-dessus si le fichier est un fichier aléatoire
    (4) Affiche proprement le rapport d'analyse
Par exemple:

analyser("fraction.txt") # renvoie
Pour le fichier fraction.txt
Il y a au total 200000 groupes de 5 chiffres
   Distincts    : Trouvé: 67674   Aléatoire: 60480
   Paire        : Trouvé: 96119   Aléatoire: 100800
   Double Paire : Trouvé: 20689   Aléatoire: 21600
   Brelan       : Trouvé: 11207   Aléatoire: 14400
   Full         : Trouvé:  4311   Aléatoire: 1800
   Carré        : Trouvé:     0   Aléatoire: 900
   Quinconce    : Trouvé:     0   Aléatoire: 20

  Afficher les rapports d'analyse du fichier "racine_2.txt" et "Champernowne.txt" puis commenter les trois rapports d'analyse: les décimales des réels x = 1002 1003 et y = 2 et z semblent-elles aléatoires ?

  On peut penser après ces trois tests que les décimales d'un réels x sont aléatoires (pour les tests de poker)  si et seulement x est irrationnel, c'est à dire que la suite de ses décimales n'est pas périodique à partir d'un certain rang. Mais il n'en est rien...

Q4) Construire une suite de 10 6 entiers de { 0 , ... , 9 } non périodique à partir d'un certain rang dont le rapport d'analyse est désastreux (pour le fait d'être aléatoire),  par exemple du genre:

Pour le fichier Beber.txt
Il y a au total 200000 groupes de 5 chiffres
   Distincts    : Trouvé:     0   Aléatoire: 60480
   Paire        : Trouvé:     0   Aléatoire: 100800
   Double Paire : Trouvé:     0   Aléatoire: 21600
   Brelan       : Trouvé:     0   Aléatoire: 14400
   Full         : Trouvé:     1   Aléatoire: 1800
   Carré        : Trouvé:  1411   Aléatoire: 900
   Quinconce    : Trouvé:198588   Aléatoire: 20

Q5) Proposer un moyen de définir un fichier contenant une suite aléatoire (au sens des tests de poker)  de 10 6 entiers de { 0 , ... , 9 } .

© 2015 - Eric Obermeyer      Powered by      Corrigé