3

ガウス分布によって広がった 24 時間の期間にポイントを設定するにはどうすればよいですか? たとえば、10 時にピークを設定するには?

4

2 に答える 2

8

次のコードは、指定された時刻を中心とし、指定された標準偏差を持つガウス分布のランダムな時間 (時間と 1 時間の端数を足したもの) を生成します。ランダムな時間は、特に標準偏差が数時間の場合、24 時間で「ラップアラウンド」することがあります。これは正しく処理されます。標準偏差が非常に大きい (何日もかかる) 場合は、別の「ラッピング」アルゴリズムの方が効率的かもしれませんが、この場合でも、分布はほぼ均一になります。

$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;
于 2008-09-30T13:27:11.003 に答える
2

ガウス分布のランダムポイントの生成に問題がある場合は、http://en.wikipedia.org/wiki/Box-Muller_transformを参照してください。

それ以外の場合は、質問を明確にしてください。

于 2008-09-30T08:26:03.053 に答える