code utilisé: toExponential() , switch()

Vers la loi de Benford

Cette page est une illustration du document que l'on peut télécharger sur le site de Mylène Koechlin . Je vous recommende la lecture de la présentation de la loi de Benford au début du document, ainsi que celle de la page Wikipedia . Sur le site, allez voir ces pages de la rubrique maths et de la rubrique Calc .

Un résultat étonnant

On s'intéresse au premier chiffre significatif n d'un nombre aléatoire distribué uniformément dans [0,1[ ( on l'obtient avec Math.random() ) ; ainsi pour 0,0034896897 on a n=3. En faisant une étude statistiques sur 1000 nombres aléatoires, on peut conjecturer que les mille valeurs de nobtenues sont équiréparties entre les chiffres 1,2,3,…,9 . Vous pouvez le vérifier en cliquant sur Test simple.

Maintenant, l'expérience consiste à calculer le produit de 20 nombres aléatoires (distribution uniforme sur [0;1[) , on appelle n le premier chiffre significatif de ce produit et N la variable aléatoire qui associe n à chaque expérience. Une étude statistique montre que ce n'est plus une répartition équilibrée mais que l'événement N=1 est le plus courant et le cas N=9 est le plus rare. La loi de N semble «proche» de la loi de Benford, c'est-à-dire de p(N=k)=log(1+1/k) . Vous pouvez vérifier cela en cliquant sur Nouvelle simulation.

Si l'on remplace 20 par 2, la loi de N semble assez différente de la loi de Benford ; ce cas est traité ici . Pour les produits de 3 nombres aléatoires, la loi de N colle beaucoup mieux à celle de Benford.

La machine

sur 1000 nombres aléatoires simples
sur 1000 produits de nombres aléatoires

n fréquence log(1+1/n)
1 0,3010
2 0,1761
3 0,1249
4 0,0969
5 0,0792
6 0,0669
7 0,580
8 0,512
9 0,0458

Le code


function ben()
{	
	var count1=0;
	var count2=0;
	var count3=0;
	var count4=0;
	var count5=0;
	var count6=0;
	var count7=0;
	var count8=0;
	var count9=0;
	
	var nbprod=1;
	nbprod =document.machineBen.entree.value;
	
	var liste=new Array();
	var res=0;
	// p compte les simulations
	for (var p=0;p<1000;p++)
	{	
		var prod=1;
		// a compte les nbs aléatoires
		for (var a=0;a<nbprod ;a++)
		{	
			prod=prod * Math.random();
		}
		//on prend le premier chiffre significatif
		res=parseInt(prod.toExponential());
		
		switch (res) 
		{	case 9: count9 ++; break;
			case 8: count8 ++; break;
			case 7: count7 ++; break;
			case 6: count6 ++; break;
			case 5: count5 ++; break;
			case 4: count4 ++; break;
			case 3: count3 ++; break;
			case 2: count2 ++; break;
			case 1: count1 ++; break;
		}
	}
	
	
	document.machineBen.count1.value=count1/1000;
	document.machineBen.count2.value=count2/1000;
	document.machineBen.count3.value=count3/1000;
	document.machineBen.count4.value=count4/1000;
	document.machineBen.count5.value=count5/1000;
	document.machineBen.count6.value=count6/1000;
	document.machineBen.count7.value=count7/1000;
	document.machineBen.count8.value=count8/1000;
	document.machineBen.count9.value=count9/1000;
}	

commentaire du code

Pour trouver le premier chiffre significatif, on a mis le résultat sous forme exponentielle avec toExponential() qui transforme , par exemple 0.000456 en 4.56e-4. Puis parseInt() prend le nombre entier qui commence la chaîne de caractère et s'arrête dès qu'un caractère invalide (ici .) apparaît. On obtient donc 4.