Distributions gaussiennes avec PHP sur une période de 24h
Question
Comment définir des points sur une période de 24h répartie par les distributions gaussiennes? Par exemple, avoir le pic à 10 heures?
La solution
Le code suivant génère un temps aléatoire distribué gaussien (en heures, plus des fractions d’heure), centré sur une heure donnée et avec un écart type donné. Les temps aléatoires peuvent «tourner» autour de l'horloge, surtout si l'écart type est de plusieurs heures: cela est géré correctement. Un algorithme de "wrapping" différent peut être plus efficace si vos écarts-types sont très grands (plusieurs jours), mais la distribution sera presque uniforme dans ce cas, de toute façon.
$peak=10; // Peak at 10-o-clock
$stdev=2; // Standard deviation of two hours
$hoursOnClock=24; // 24-hour clock
do // Generate gaussian variable using Box-Muller
{
$u=2.0*mt_rand()/mt_getrandmax()-1.0;
$v=2.0*mt_rand()/mt_getrandmax()-1.0;
$s = $u*$u+$v*$v;
} while ($s > 1);
$gauss=$u*sqrt(-2.0*log($s)/$s);
$gauss = $gauss*$stdev + $peak; // Transform to correct peak and standard deviation
while ($gauss < 0) $gauss+=$hoursOnClock; // Wrap around hours to keep the random time
$result = fmod($gauss,$hoursOnClock); // on the clock
echo $result;
Autres conseils
Si vous ne parvenez pas à générer des points aléatoires répartis en Gauss, recherchez http: //en.wikipedia. org / wiki / Box-Muller_transform
Sinon, veuillez clarifier votre question.