Страницы

Поиск по вопросам

четверг, 28 ноября 2019 г.

Рандом: чем ближе число к нулю, тем чаще оно должно выпадать

#java #алгоритм #случайные_числа


Имеется функция, которая даёт рандомное число в радиусе [-40 .. 40] 
Как сделать так, чтобы числа, близкие к нулю (0, 5, -5) выпадали чаще, чем крайние
(40, -35, и т.д.)  ?

Условно можно представить в виде графика y(x) = -(x*x*0.061)+100
По горизонтали: число, которое должно выпасть
По вертикали: частота выпадения

    


Ответы

Ответ 1



Имеются алгоритмы, позволяющие получить случайное число с заданным распределением вероятности, но чтобы их применить - надо сначала получить это самое распределение (или его плотность). Сначала посмотрите на разные распределения и найдите какое вам подходит или нарисуйте свое (то, что вы нарисовали - ни распределением, ни плотностью вероятности не является). Распределение вероятности будет функцией F(X): [-40, 40] → [0, 1), плотность - функцией f(X): [-40; 40] → [0, +∞). Теперь что с ней можно сделать. Алгоритм первый, математический. Генерируем случайное число от 0 до 1 стандартными средствами, после чего применяем к нему функцию, обратную F: X = F-1(Y), где Y - равномерно распределенное случайное число в интервале [0, 1). Недостатки этого варианта - возможная нехватка точности на сильно неравномерных распределениях и необходимость вычисления обратной функции. Алгоритм второй, итерационный. Генерируем два обычных случайные числа, первое (X) от 40 до -40, второе (Y) от 0 до максимального значения плотности вероятности. Если f(X) < Y - возвращаем X, иначе - повторяем с начала. Если вы генерируете целые числа, а не вещественные - то для второго алгоритма надо брать вероятность вместо плотности вероятности.

Ответ 2



Представленная вами функция на математическом языке называется функция распределения плотности вероятности Общее правило генерации случайного числа с заданной F(x) функцией следующая: 1) Допустим имеется генератор дающий равномерно распределенную рандомную величину от 0 до 1 - обозначим ее как u 2) В этом случае ваше случайное значение x должно вычисляться как: x=F^-1(u) //обратная функция от F с аргументом u Для вашего случая это: x=sqrt((100-u)/0.061) P.S. Вообще ваша функция очень похожа на шапку Гаусса - не извращайтесь со степенной функцией и примените именно ее - нормальное распределение.

Ответ 3



Задачу всё-таки решил, но не предложенными вариантами. Итак. Изначально задача звучит так: Создать число в промежутке от 6 до 14. Чем число ближе к 10, тем оно должно выпадать чаще (в самом вопросе я поменял условие задачи, но не суть важно) Для её решения понадобится два рандомных числа в промежутке [3..7]. Полученные два числа надо сложить друг с другом. Таблица сложения: Вывод: Сумма этих двух случайных чисел и есть наше конечное число В итоге, чем ближе число к 10, тем чаще оно выпадает P.S. Прочитал данный метод в книге Галёнкина

Комментариев нет:

Отправить комментарий