[Précédent]
[Index] | [Corrigé] | [Version imprimable]
[Prochain]

5.8
  Loi de Benford - Enoncé
Niveau 1
 
 
But:
  Ecrire un programme permettant de vérifier la loi de Benford    
Thème:
  Modularisation, algorithme    
Fichiers:
  Benford.java    

La loi de Benford stipule que dans la vie de tous les jours, le chiffre 1 est plus fréquent que le 2, lui-même plus fréquent que le 3, etc ...

De façon générale, la loi dit que la fréquence d'apparition, f, de la première décimale (chiffre le plus à gauche), d, dans une suite de nombres exprimés en base 10 est donnée par :

f = log10(1 + 1/d)
Ce qui aboutit au tableau de résultats suivants (fréquences relatives d'apparition de la 1ère décimale, exprimées en pourcentages)  :

d 1 2 3 4 5 6 7 8 9
f 30.1 17.6 12.5 9.7 7.9 6.7 5.8 5.1 4.6

qui s'interprète comme : dans une suite de nombres, par exemple les recettes mensuelles d'un restaurant, il y a environ 30.1% de nombres ayant 1 comme 1ère décimale, 17.6% de nombres ayant 2 comme première décimale etc..)

Le but de cet exercice est de tester la loi de Benford sur une suite de nombres générés automatiquement.

1. Création du jeu de données

Le fichier fourni Benford.java contient déjà un programme principal qui vous servira à tester votre code.

Programmez dans ce fichier une méthode auxiliaire :

fillWithSquare(double[] numbers)

de sorte à ce que numbers[i] stocke le carré de i+1 divisé par 100.0 . Le tableau fourni à la méthode sera intégralement rempli.

Le tableau numbers stocke en fait la suite de nombres sur laquelle nous allons tester la loi de Benford.

Exemple de tableau construit  :

{0.01, 0.04, 0.09,  0.16,  0.25,  ...}

Libre à vous de modifier par la suite l'algorithme générant les données de ce tableau.

2. Extraction du chiffre le plus à gauche

Programmez maintenant la méthode auxiliaire :

int extractMaxDigit(double number)

de sorte à ce qu'elle retourne le chiffre le plus à gauche de number.

Par exemple extractMaxDigit(-635.87) doit retourner 6.

Vous ne convertirez pas le nombre en String mais utiliserez les opérateurs arithmétiques (comme / , * ou \%).

Vous traiterez aussi le cas des nombres négatifs

3. Calcul du nombre d'apparition

Programmez une méthode analyze, construisant le tableau occurences à partir de la suite de nombres numbers.

Voici l'entête de la méthode :

void analyze(double[] numbers, int[] occurences)

Chaque entrée occurences[i] stocke le nombre de fois où i+1 est le chiffre le plus à gauche dans la suite numbers.

Par exemple si numbers contient les nombres {0.01, 0.04, 0.09, 0.16, 0.25, 0.36, 0.49, 0.64} le tableau occurences sera

{2, 1, 1, 2, 0, 1, 0, 0, 1}

Vous utiliserez la méthode extractMaxDigit.

4. Test de la loi de Benford

Programmez enfin une méthode testBenford affichant, au moyen du tableau occurences, une comparaison entre les prévisions de la loi de Benford et les fréquences effectives d'apparition des différentes décimales dans la suite numbers.

L'affichage se fera selon le modèle suivant  :

Pourcentage effectif / Predictions de la loi de Benford :
1 : 28.000000000000004%, Benford : 30.10299956639812%
2 : 16.0%, Benford : 17.609125905568124%
3 : 12.0%, Benford : 12.493873660829994%
4 : 20.0%, Benford : 9.691001300805642%
5 : 8.0%, Benford : 7.918124604762482%
6 : 8.0%, Benford : 6.694678963061322%
7 : 0.0%, Benford : 5.799194697768673%
8 : 4.0%, Benford : 5.115252244738129%
9 : 4.0%, Benford : 4.575749056067514%
Indications : la méthode double Math.log10(double x) retourne le logarithme en base 10 d'un nombre donné.

Testez votre programme au moyen du programme principal fourni.

Il devrait produire un affichage tel que  :

Test 1.1 : 
0.01 0.04 0.09 0.16 0.25 0.36 0.49 0.64 0.81 1.0 1.21 1.44 1.69 1.96 2.25 2.56 2.89 3.24 3.61 4.0 4.41 4.84 5.29 5.76 6.25 

Test 1.2 : 
0
6
2
5
4

Test 1.3 : 
7 4 3 5 2 2 0 1 1 

Test 1.4 : 
Comparaison des frequences avec les predictions de la loi de Benford :
1 : 28.000000000000004%, Benford : 30.10299956639812%
2 : 16.0%, Benford : 17.609125905568124%
3 : 12.0%, Benford : 12.493873660829994%
4 : 20.0%, Benford : 9.691001300805642%
5 : 8.0%, Benford : 7.918124604762482%
6 : 8.0%, Benford : 6.694678963061322%
7 : 0.0%, Benford : 5.799194697768673%
8 : 4.0%, Benford : 5.115252244738129%
9 : 4.0%, Benford : 4.575749056067514%

 


[Précédent]
[Index] | [Corrigé] | [Version imprimable]
[Prochain]