выборка случайных элементовл с вероятностью...

  • Автор темы valerchik
  • Дата начала

SelenIT

IT-лунатик :)
SiMM
если сумма всех вероятностей равна 1 - он будет работать
а если не равна - то это уже не вероятности. По крайней мере, не вероятности выбора данного элемента из данного массива.

подобное твоему условие нужно разве что при размешивании карт колоды
... а также при выводе блока баннеров или колонки анекдотов, к примеру.

вероятность ... повтора крайне низка
...разве она не равна квадрату вероятности отдельного события? Ибо по сути тоже является условной вероятностью...

Собственно, вопрос-то, в общем, решен уже давно. Решение найдено и много раз продемонстрировано как на словах, так и в коде (кстати, мое описание алгоритма существенно отличается от твоей реализации только тем, что у меня суммарная вероятность равна 1 по построению). Спор был исключительно о деталях реализации с точки зрения оптимальности. А также (с моей стороны) - об универсальности решения, как для независимых, так и для условных вероятностей. Признаю, что это уже другая тема, и прошу прощения за оффтоп.
 

che

Guest
Originally posted by SiMM
che, между прочим, если вы внимательно присмотритесь к моему алгоритму, то как раз таки и увидите, что сравнение происходит с границами интервалов :)
Был не прав. Погорячился.

единственная ошибка, которую я допустил - забыл о том, что 1e10 - уже далеко не целое число,


if ( ($rnd -= $v) <=0) return $k;

Если вероятности определены так, что сумма их больше единицы(а по большому счету больше $rnd), это не будет выявлено.

Так, а в моем решении наблюдаются проблемы с граничными значениями (когда $rnd==0) Предлагаю совместить подходы :)

PHP:
function random ($ver, $rnd=false) { 
($rnd===false) && $rnd=mt_rand(0, 10)  ; 
$c=0; 
$res=0; 
$f = true ;
foreach ($ver as $k => $v) 
 ( ($c+=$v*10)  && ( ($rnd-=$v*10)<=0 ) && $f) && ( ($res = $k ) && ($f = false ) ); 
$c==10 || trigger_error('Сумма всех вероятностей недопустима', E_USER_WARNING); 
return $c==10 ? $res : false ; 
}
 
Сверху