function getProbability_1($events)
{
while (true)
{
$r = array_rand($events);
if (mt_rand(1, 1000000) <= $events[$r] * 1000000)
return $r;
}
}
function getProbability_2($events)
{
while (true)
{
$r = array_rand($events);
if (mt_rand(1, 1000000) <= $events[$r] * 1000000)
break;
}
return $r;
}
function getProbability_3($events)
{
do
{
$r = array_rand($events);
}while(mt_rand(1, 1000000) > $events[$r] * 1000000);
return $r;
}
у всех 3-х функций "точность" достаточная, как показывает тест.
скорость функции 3 чуть чуть выше, чем 2. а первая работает на порядок дольше.
Вообще все представленные ф-ии делают тоже самое, а тут мы просто делаем лишние действия, тем что рандомно достаем из массива ключи и тутже выбрасываем.
когда малые вероятности расположены ближе к началу, можно предложить обратную сортировку, но в этом тоже смысла нет, лишняя нагрузка для остальных случаев.