Задать вопрос
damirazo
@damirazo
Software developer

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

Здравствуйте! Имеется последовательный список значений, например от 12 до 50. Необходимо выбрать случайное значение из данного списка при том условии, что чем меньше число, тем больше шанс его выпадения. Желательно, чтобы шанс выпадения каждого последующего числа уменьшался на одно и тоже определенное значение относительно предыдущего числа. Какие посоветуте алгоритмы для решения данной задачи?
  • Вопрос задан
  • 5151 просмотр
Подписаться 5 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 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() возвращают, обычно, равномерно распределенную случайную величину. Но есть формулы для преобразования их в случайные величины с другими распространенными распределениями.
Я слышал про преобразование Бокса-Мюллера, но оно переводит пару равномерных в пару нормальных. Попробуйте поискать что-то подобное для экспоненциального, например.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы
от 200 000 до 300 000 ₽
Greenway Global Новосибирск
от 150 000 ₽
Akronix Санкт-Петербург
от 150 000 до 200 000 ₽
02 февр. 2025, в 10:19
7000 руб./за проект
02 февр. 2025, в 08:12
2500 руб./за проект