生成[M..N]范围内的随机数很容易。然而,我希望在该范围内生成一系列随机数,其中平均值为X(M 例如,假设以下内容:
M = 10000
N = 1000000
X = 20000
我想生成(大量)随机数,以便涵盖整个范围[M..N],但在这种情况下,更接近N的数字应该变得非常罕见。接近M的数字应更常见,以确保均值收敛于X. 目标语言是PHP,但这本身并不是语言问题。
答案 0 :(得分:1)
有很多方法可以实现这一点,根据您对精度的要求,它会有很大不同。以下代码使用68-95-99.7 rule,基于正态分布,标准偏差为平均值的15%。
它没有:
但它确实给你一个开始:
<?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;
*/
?>
希望它有所帮助!