【问题标题】:php - one-sided gaussian distribution for randomnessphp - 随机性的单边高斯分布
【发布时间】:2015-09-20 00:53:17
【问题描述】:

我意识到这是复杂而具体的,但由于我的概率很低,我想我会尝试在这方面寻求一些帮助。

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

我希望它的设置方式是这样的。 (假设第一个选择是随机的,请原谅我的语法)。

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

我本质上希望3 的概率最高,4 第二高 5 第三高,环绕(以某个数字为模)以使2 的概率最低。

我该怎么做?我不想强迫相同的数字重复,我只是希望它这样做的可能性更高(并且它顺序进行的可能性也更高)。让我知道是否需要澄清,但基本上初始选择 3 和模数 6,我希望下一个选择的概率是这样的:

P(3)=30%
P(4)=25%
P(5)=20%
P(0)=12.5%
P(1)=7.5%
P(2)=5%

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

【问题讨论】:

  • 如果 P(4)=25% 和 P(2)=5% 我认为它不是高斯的。这是一些倾斜的分布。我认为最好的方法是确定您需要的分发类型(在 stats.stackexchange.com 上),然后寻找一种将其实现到 PHP 中的方法。

标签: php random probability


【解决方案1】:

这是使用Marsaglia polar method 计算的单边高斯钟形曲线

 <?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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-14
    • 2014-03-09
    • 2015-04-22
    • 2020-08-24
    • 2012-10-08
    • 1970-01-01
    • 1970-01-01
    • 2011-06-12
    相关资源
    最近更新 更多