1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
|
<?php
define('DEUX_PI', ( 2.0 * 3.141592653589793238462643383279502884197169399375 ));
define('SIGMA', 35); // La variance, plus c'est un grand, plus on sera éloigné de 100.
define('NB_SIMULATIONS', 1000); // Nombre de tirages à effectuer
/**
* Générer un nombre aléatoire avec la loi normale
* espérance $mu
* ecart-type $sigma
*/
function genererNombreLoiNormale($mu, $sigma) {
// On récupère deux nombres pseudo-aléatoires indépendants selon une loi uniforme sur l'intervalle [0;1]
$randNumUni = rand(0,999) / 1000;
$randNumBi = rand(0,999) / 1000;
// On récupère un nombre pseudo-aléatoire selon une loi normale centrée réduite
// (Paramètres : moyenne = 0, écart-type = 1)
// Utilisation de l'algorithme de Box-Muller
$randNumNorm = sqrt(-2.0*log($randNumUni))*cos(DEUX_PI*$randNumBi);
return ($mu + $sigma * $randNumNorm);
}
/**
* Génère un nombre entre 100 et -infini. Assez proche de 100 en général...
*/
function genererNombre() {
$x = intval(genererNombreLoiNormale(0, SIGMA));
return 100 - abs($x);
}
// Tableau récapitulatif des résultats
$intervalles_resultats = array(
"absurde" => 0,
"01 - 10" => 0,
"11 - 20" => 0,
"21 - 30" => 0,
"31 - 40" => 0,
"41 - 50" => 0,
"51 - 60" => 0,
"61 - 70" => 0,
"71 - 80" => 0,
"81 - 90" => 0,
"91 - 100" => 0
);
for ($i = 0; $i < NB_SIMULATIONS; $i++)
{
$x = genererNombre();
if ($x >= 0)
{
// On range le résultat dans le tableau
if ($x == 100)
{
$intervalle = "91 - 100"; //petit cas particulier
}
else
{
$dizaine = intval($x / 10);
$intervalle = $dizaine . "1 - ". ($dizaine+1) . "0";
}
$intervalles_resultats[$intervalle] ++;
}
else
{
$intervalles_resultats["absurde"] ++;
}
}
var_dump($intervalles_resultats);
?> |
Partager