【问题标题】:Generate random number in range [M....N] with mean X生成范围 [M....N] 中的随机数,均值为 X
【发布时间】:2016-03-24 09:17:41
【问题描述】:

在 [M..N] 范围内生成一个随机数很容易。但是,我想在该范围内生成一系列随机数,平均值为 X (M

例如,假设如下: M = 10000 N = 1000000 X = 20000 我想生成(大量)随机数,以便覆盖整个范围 [M..N],但在这种情况下,接近 N 的数字应该变得非常罕见。更接近 M 的数字应该更常见,以确保均值收敛到 X。

预期的目标语言是 PHP,但这本身不是语言问题。

【问题讨论】:

  • 你知道分布应该是什么样子吗?您可以通过使用两种均匀分布(也称为标准随机函数)轻松实现这一点,一种用于 [M..X],另一种用于 [X..N] 加权,因此平均值为 X。
  • 有趣。因此,[M..X] 中的均匀分布将具有 (M+X)/2 的平均值,而 [X..N] 中的均匀分布将具有 (X+N)/2 的平均值,对吗?然后对这两个方法进行加权,使它们的 EV 为 X……你是这个意思吗?
  • 是的,您只需通过掷硬币来决定使用哪个分布。这满足了您的要求,但可能无法给出您想要的“形状”。
  • 如果我想,我怎么能影响形状?无论如何,你的建议是我已经可以使用的!
  • 您将查看您的统计数据并查看this page 以了解有限区间的分布。

标签: php random numbers probability distribution


【解决方案1】:

有很多方法可以做到这一点,根据您对精度的要求,它会有很大的不同。以下代码使用68-95-99.7 rule,基于正态分布,标准差为均值的15%。

它没有:

  • 确保精确。如果需要,您必须计算实际平均值并补偿缺失的金额。
  • 动态创建了一个真正的正态分布曲线,因为所有三个块 (68-95-99.7) 在它们的组内都被认为是相等的。

不过,它确实给了你一个开始:

<?php

$mean = (int)$_GET['mean']; // The mean you want
$amnt = (int)$_GET['amnt']; // The amount of integers to generate
$sd = $mean * 0.15;
$numbers = array();
for($i=1;$i<$amnt;$i++)
{
    $n = mt_rand(($mean-$sd), ($mean+$sd));
    $r = mt_rand(10,1000)/10; // For decimal counting
    if($r>68)
    {
        if(2==mt_rand(1,2)) // Coin flip, should it add or subtract?
        {
            $n = $n+$sd;
        }
        else
        {
            $n = $n-$sd;
        }
    }
    if($r>95)
    {
        if(2==mt_rand(1,2))
        {
            $n = $n+$sd;
        }
        else
        {
            $n = $n-$sd;
        }
    }
    if($r>99.7)
    {
        if(2==mt_rand(1,2))
        {
            $n = $n+$sd;
        }
        else
        {
            $n = $n-$sd;
        }   
    }
    $numbers[] = $n;
}

arsort($numbers);
print_r($numbers);

// Echo real mean to see how far off you get. Typically within 1%

/*
$sum = 0;

foreach($numbers as $val)
{
    $sum = $sum + $val;
}

 echo $rmean = $sum/$amnt; 
*/

?>

希望对你有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-20
    • 2021-10-06
    • 1970-01-01
    • 2010-10-20
    • 2010-09-22
    相关资源
    最近更新 更多