代码之家  ›  专栏  ›  技术社区  ›  powtac

24小时内PHP的高斯分布

  •  3
  • powtac  · 技术社区  · 17 年前

    如何在24小时内设置由高斯分布分布分布的点?例如,在10点钟达到峰值?

    2 回复  |  直到 17 年前
        1
  •  8
  •   Chris Johnson Thomas M. DuBuisson    17 年前

    以下代码生成以给定时间为中心且具有给定标准偏差的高斯分布随机时间(以小时为单位,加上一小时的分数)。随机时间可能会“环绕”时钟,特别是如果标准偏差为几个小时:这是正确处理的。如果您的标准偏差非常大(很多天),则不同的“包装”算法可能更有效,但在这种情况下,分布几乎是一致的。

    $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;
    
        2
  •  2
  •   Dologan    17 年前

    如果无法生成高斯分布随机点,请查找 http://en.wikipedia.org/wiki/Box-Muller_transform

    否则请澄清你的问题。