2008-09-30 21 views
3

Comment puis-je définir des points sur une période de 24h étalée par les distributions gaussiennes? Par exemple pour avoir le pic à 10 heures?Distributions gaussiennes avec PHP sur une période de 24 heures

+0

@Roel: l'écart-type n'a pas d'importance, j'ai juste besoin de la logique PHP. Nous pourrions utiliser quelque chose comme 8. – powtac

+0

Désolé, j'ai mal compris la question et j'ai supprimé ma «réponse» (qui n'était pas une réponse en premier lieu). Toutes mes excuses pour le bruit. – Roel

+0

Je suggère d'illustrer ce dont vous avez besoin sous la forme d'une fonction php - quelles entrées avez-vous disponibles, et qu'est-ce qui caractériserait une sortie réussie. –

Répondre

8

Le code suivant génère un temps aléatoire réparti gaussien (en heures, plus fractions d'heure) centré à un instant donné et avec un écart-type donné. Les temps aléatoires peuvent "enrouler" autour de l'horloge, surtout si l'écart type est de plusieurs heures: ceci est géré correctement. Un algorithme d'emballage différent peut être plus efficace si vos écarts-types sont très importants (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; 
+1

Je pense que cette forme de l'algorithme est appelée "méthode polaire de Marsaglia". – lapo