// задаем вероятности выпадания числа в каждом промежутке. Суммарный prob должен быть равен 100
$data = [
[
'start' => 0, // начало промежутка
'end' => 7, // окончание промежутка
'prob' => 20, // вероятность попадания, %
],
[
'start' => 8, // начало промежутка
'end' => 15, // окончание промежутка
'prob' => 80, // понижающий коээффициент на вероятность, %
]
];
// вызываем функцию для получения произвольного числа с учетом вероятности попадания в промежуток
function calcRand($data) {
$prob = rand(0, 100);
$pr = 0;
$out = 0;
foreach ($data as $info) {
if ($prob >= $pr && $prob < $pr + $info['prob']) {
$out = rand($info['start'], $info['end']);
break;
}
$pr += $info['prob'];
}
return $out;
}
// проверочный код для демонстрации распределения
$numbers = [];
for ($i = 0; $i < 10000; $i++) {
$number = calcRand($data);
$numbers[$number] = (isset($numbers[$number]) ? $numbers[$number] + 1 : 1);
}
ksort($numbers);
echo '<pre>';
var_export($numbers);
var_export(array_map(function($a) { return round($a / 100); }, $numbers));