2008-09-30 70 views
3

如何設置由高斯分佈擴展的24h週期的點?例如要在10點鐘有高峯?帶有PHP的24h高斯分佈

+0

@Roel:標準偏差不重要,我只是需要PHP邏輯。我們可以使用類似於8. – powtac 2008-09-30 07:46:25

+0

對不起,我誤解了這個問題,並刪除了我的'答案'(這首先不是答案)。對噪音抱歉。 – Roel 2008-09-30 08:10:45

回答

8

以下代碼以給定時間爲中心並以給定標準偏差生成高斯分佈隨機時間(以小時爲單位,加上小時的幾分之一)。隨機時間可能會「迴繞」時鐘,特別是如果標準偏差爲幾個小時:這是正確處理的。如果你的標準偏差非常大(很多天),一個不同的'包裝'算法可能會更有效率,但無論如何,在這種情況下,分佈幾乎是一致的。

$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;