Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > Случайный выбор из массива с % коррекцией


Автор: chaosty 2.1.2008, 13:54
Есть двумерный массив, с идентификатором и % "срабатывания"
Код

$arr[1]="50%"
$arr[2]="20%"
$arr[3]="20%"
$arr[4]="10%"


Задачка каждый раз выбирать "случаный" ид из массива, но увеличивать шанс срабатывания в зависимости от %... 
то есть к примеру из 10 итераций, 5 раз должно повезти $arr[1], возможны небольшие расхождения.
никак не могу представить формулу в голове :( форум посмотрел, но не нашел такого.

Автор: JackYF 2.1.2008, 14:01
Цитата(chaosty @  2.1.2008,  13:54 Найти цитируемый пост)
5 раз должно повезти $arr[1], возможны небольшие расхождения.
никак не могу представить формулу в голове :(

формула распределения Пуассона, например.

Автор: chaosty 2.1.2008, 14:13
Гм, а есть экземпляр на С или php\perl? Я к сожалению не математик)

Автор: JackYF 2.1.2008, 14:39
Цитата(chaosty @  2.1.2008,  14:13 Найти цитируемый пост)
Гм, а есть экземпляр на С

у меня нет, но можешь посмотреть исходники boost::random, там есть реализация многих распределений случайных чисел, в том числе, ЕМНИП, и этого.

Автор: maxim1000 2.1.2008, 16:50
предположим у нас есть возможность генерировать псевдослучайное целое число из 0..9 с одинаковой вероятностью для каждого значения
всего у нас 10 возможных значений
разобьём их на 4 группы:
0..4, 5..6, 7..8, 9
тогда вероятности, что число попадёт в один из отрезков такие:
0 - 50%
1 - 20%
2 - 20%
3 - 10%
конечно, здесь не получится смоделировать вероятности типа 25% - тогда нужно будет использовать числа хотя бы из 0..19, ну и т.д.

Автор: chaosty 2.1.2008, 17:30
Допер) на самом деле все проще, просто делаем еще один массив, из 100 элементов, заполняем его Ключами первого массива в соотношении %
тоесть к примеру $arr[0] - $arr[50] будет равнятся 1,  с 50 по 70 будет 2 ну и так далее..
потом просто берем рандом от 0 до 100, и получаем % срабатывания..

Автор: Akina 2.1.2008, 18:42
Цитата(chaosty @  2.1.2008,  18:30 Найти цитируемый пост)
делаем еще один массив, из 100 элементов

Зачем? делаем просто массив соответствия вероятностей:
Цитата(maxim1000 @  2.1.2008,  17:50 Найти цитируемый пост)
0 - 50%
1 - 20%
2 - 20%
3 - 10%

конвертируется в
0 - from 0 to 0.5
1 - from 0.5 to 0.7
2 - from 0.7 to 0.9
3 - from 0.9 to 1
и смотри, куда попал очередной rnd()

Автор: chaosty 2.1.2008, 19:11
я массив указал просто для вида, он может быть и на 50 записей, проценты могут быть любыми. то есть задается динамически.

Автор: Akina 2.1.2008, 23:58
Цитата(chaosty @  2.1.2008,  20:11 Найти цитируемый пост)
проценты могут быть любыми. то есть задается динамически. 

а какая разница? и вообще - какого рожна проценты? что, трудно в доли пересчитать? тогда делаешь сумму с накоплением - и ты в шоколаде.

PS. А будешь планировать на целые значения - не забывай о завалах RND по краям, а то ждут тебя сюрпризы

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)