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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top