Страница 1 из 1
случайное знач-е из списка с опред. долей вероятности
Добавлено: 27 июн 2005, 19:38
berkut
Помогите с алгоритмом выборки случайного значения с определённой долей вероятности.
Есть писок значений, допустим:
array('text1', 'text2', 'text3')
и список вероятности выпадения каждого из значений, в процентах:
array(10, 40, 50)
т.е. доля вероятности выборки 'text1' составляет 10% и т.д.
Но это не значит, что произведя выборку 100 раз, мы получим значение 'text1' ровно 10 раз.
Добавлено: 28 июн 2005, 07:33
evgeny_d
java пример:
public Object getRandom(Object [] a, double [] p) throws Exception{
if (a.length != p.length) throw new Exception("Wrong entry data!");
double alfa = random.getDouble(); // random between 0 and 1
for (int i=0; i<a.length; i++){
if (p<0) throw new Exception("Wrong distribution: p["+i+"]<0!");
alfa -= p;
if (alfa<0) return a;
}
throw new Exception("Wrong distribution: sum of probabilities is not 1");
}
источник: http://www.evgeny4.dev.juga.ru/docs/ran ... ME_eng.htm
Добавлено: 28 июн 2005, 09:48
berkut
ух ёлки, evgeny_d, можно словами или на пхп?
Добавлено: 28 июн 2005, 13:00
evgeny_d
Ну синтаксис PHP не так уж и сильно отличается от java.
Словами:
1. Нужно сгенерить равномерно распределенное число x от 0 до 1 (что в сущности функция rand() и должна делать...)
2. По определению вероятность P(a<x<b)=(b-a) для любых 0<a<b<1.
(тут вероятность измеряется от 0 до 1). На этом и построен алгоритм.
и список вероятности выпадения каждого из значений, в процентах:
array(10, 40, 50)
Откладываем на отрезке [0,1] соотв. интервалы длиной 0.1, 0.4 и 0.5 (сумма их всегда должна равняться 1 по определению распределения вероятностей).
Смотрим в какой из интервалов попал x (последовательным вычитанием). Выбираем соотв. объект.
End of story.
Добавлено: 04 июл 2005, 22:28
berkut
evgeny_d, в коде ошибка. по-моему должно быть:
if (alfa=<0) return a;
ищin=
[off]что-то намухлевали с форумом, не подсвечивает конструкции типа
[ b ]=[/ b]
Добавлено: 05 июл 2005, 07:20
evgeny_d
Угу... хотя это зависит от выбора random() - достижима ли единица.