php - 随机性的单侧高斯分布

时间:2015-07-02 13:05:39

标签: php random probability

我意识到这是复杂而具体的,但由于我很可能,我认为我会尝试在此方面获得一些帮助。

我基本上想要做的是根据先前的随机数选择获得具有加权概率的随机数。

我喜欢它的设置方式就是这样。 (假设第一个选择是随机的,并原谅我的语法)。

$start = 3; 
$next = /* function call to get random value */

我基本上希望3的概率最高,4成为第二高5的第三高,包围(以某个数为模),以便{{1}概率最低。

我该怎么做?我不想强制重复相同的数字,我只是想要它更高的概率(并且它顺序进行的概率也高于没有)。如果需要澄清,请告诉我,但基本上选择2和模3,我希望下一个选择的概率是这样的:

6

我没有设定那些特定的概率,只是它们的顺序 - 单侧的钟形曲线形状会很好(特别是如果有内置的功能来支持它)。

1 个答案:

答案 0 :(得分:1)

这是用Marsaglia polar method

计算的单侧gausian钟形曲线
 <?php
 function rand_polar_onesided($m = 0.0, $s = 1.0){
       do {
         do {
               $x = (float)mt_rand()/(float)mt_getrandmax();
               $y = (float)mt_rand()/(float)mt_getrandmax();

               $q = pow((2 * $x - 1), 2) + pow((2 * $y - 1), 2);
         }
         while ($q > 1);

         $p = sqrt((-2 * log($q))/$q);

         $y = ((2 * $y - 1) * $p);
         $x = ((2 * $x - 1) * $p);
         $val = $y * $s + $m
       }
       while($val < $m) // reject if the calculated value is smaller than the input

       return $val;
 }
 ?>

用法:

 rand_polar_onesided(MEAN, STANDARD_VARIANCE);