ガウス分布によって広がった 24 時間の期間にポイントを設定するにはどうすればよいですか? たとえば、10 時にピークを設定するには?
2754 次
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 に答える