Генерация случайного числа в диапазоне [M …. N] со средним значением X

Генерация случайного числа в диапазоне [M..N] достаточно проста. Однако я хотел бы создать серию случайных чисел в этом диапазоне со средним значением X (M < Икс < N).

Например, предположим следующее:
М = 10000
N = 1000000
X = 20000
Я хотел бы генерировать (большое количество) случайных чисел так, чтобы охватывался весь диапазон [M..N], но в этом случае числа, близкие к N, должны стать значительно более редкими. Числа ближе к M должны быть более распространенными, чтобы среднее значение сходилось к X.

Предполагаемый целевой язык — PHP, но это не вопрос языка как таковой.

5

Решение

Есть много способов сделать это, и это будет сильно отличаться в зависимости от ваших требований к точности. Следующий код использует 68-95-99.7 правило, на основе нормального распределения со стандартным отклонением 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;
*/

?>

Надеюсь, поможет!

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]