damirazo
@damirazo
Software developer

Выбор случайного значения

Здравствуйте! Имеется последовательный список значений, например от 12 до 50. Необходимо выбрать случайное значение из данного списка при том условии, что чем меньше число, тем больше шанс его выпадения. Желательно, чтобы шанс выпадения каждого последующего числа уменьшался на одно и тоже определенное значение относительно предыдущего числа. Какие посоветуте алгоритмы для решения данной задачи?
  • Вопрос задан
  • 5151 просмотр
Пригласить эксперта
Ответы на вопрос 5
denver
@denver
Заполняем массив 50, 49, 49, 48, 48, 48, 47, 47, 47, 47… и выбираем случайное из него
Ответ написан
Karde
@Karde
Ph.D. student at the GWU & CBI
Муделируйте с помощью rand равномерное на (0,1), а с его помощью моделируйте уже нужное вам.
Ответ написан
Комментировать
@skomoroh
import random
import bisect

# наш список
l = list(range(12,50))

# задаем веса, например: вес=70-позиция, можно любой
lw = [(i, 70-i) for i in l]

# суммируем веса
tw = 0
wd = dict()
for i, w in lw:
    tw += w
    wd[tw] = i
wk = sorted(wd.keys())     

# получаем наше значение
value = wd[wk[(bisect.bisect_right(wk, random.random()*tw))]]
Ответ написан
@Ents
<?php
function destination($x)
{
	return 1/2 * exp(-$x * $x); //интеграл от распределения вероятности x * exp(-x * x), принимает на вход 0..1
}
function my_rand($min, $max)
{
	return $min + destination(random()) * ($max - $min);
}
function random() //random 0..1
{
	return mt_rand() / mt_getrandmax();
}

echo my_rand(10, 100);


Вот накатал пример. destination — это интеграл от распределения нужной вероятности вероятности (нормированная на еденицу)

В данном случае возвращаются числа по распределению Максвелла
Ответ написан
Bashuk
@Bashuk
Стандартные rand() возвращают, обычно, равномерно распределенную случайную величину. Но есть формулы для преобразования их в случайные величины с другими распространенными распределениями.
Я слышал про преобразование Бокса-Мюллера, но оно переводит пару равномерных в пару нормальных. Попробуйте поискать что-то подобное для экспоненциального, например.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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