Как сгенерировать случайное число, чем больше число — тем меньше шанс?

Нужно сгенерировать случайное число в определенном диапазоне, при этом шанс на большее число должен быть меньшим (Чем больше число - тем меньше шанс его выпадения)
  • Вопрос задан
  • 271 просмотр
Пригласить эксперта
Ответы на вопрос 3
vilinyh
@vilinyh
У, задачка из школьной математики, вспомнить бы еще.

Если я правильно думаю, надо взять функцию плотности вероятности, проинтегрировать на заданном интервале, взять от интеграла обратную функцию и подставлять аргументы генератором равномерного распределения для этой функции.

Ну то есть если у тебя линейное убывание вероятности f(x) = -x, это будет повернутый корень квадратный на заданном интервале (что-то типа, посчитайте кто еще не забыл интегралы со школы).

В общем получается:

/**
 * Generates a random number between 0.00 and 1.00
 */
function generateNum()
{
    return 1 - sqrt(rand(0, 1000)/1000);
}


Тест:
$nums = [];
for($i = 0; $i < 10000; ++$i) {
    $index = sprintf('%.1f', floor(generateNum() * 10) / 10);
    $nums[$index] = ($nums[$index] ?? 0) + 1;
}

ksort($nums);

var_dump($nums);


Получившаяся плотность вероятности (частотная):
60f0a01d70601334855555.png
Ответ написан
Stalker_RED
@Stalker_RED
Если перемножить два случайных числа, то вы получите уже не линейное распределение, а распределение Пирсона.


Можно поиграться с циферками добавляя какие-то коэффициенты.
Ответ написан
catanfa
@catanfa
просто в цикле от 1 до вашего максимума генерируйте либо 0 либо 1 случайно. Если выпал 1, то продолжайте цикл. Если выпал 0, то останавливайте цикл. Результатом будет текущая итерация цикла. Таким образом, вероятность каждого большего числа уменьшается.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы