24小时内使用PHP进行高斯分布
时间:2020-03-06 14:54:42 来源:igfitidea点击:
如何在由高斯分布扩展的24小时周期内设置点?例如要在10点达到顶峰?
解决方案
如果我们在生成高斯分布随机点时遇到问题,请查看http://en.wikipedia.org/wiki/Box-Muller_transform
否则,请澄清问题。
以下代码生成以给定时间为中心并具有给定标准偏差的高斯分布随机时间(以小时为单位,加上小时的分数)。随机时间可能会"绕过去",特别是在标准偏差为几个小时的情况下:正确处理。如果标准偏差非常大(很多天),则不同的"包装"算法可能会更有效,但是无论如何,这种情况下的分布几乎都是均匀的。
$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;