генерация случайного числа с заданной вероятностью. Как это реализовать в PHP? Например есть массив $random(1=>25%,2=>50%,3=>10%,4=>15%);
Для решения Вашей задачи, существуют следующие методы:
Аналитический;
Табличный;
Метод композиций (не буду рассматривать, так как его применяют при получении распределений по закону Эрланга или гиреэкспоненциальному).
Аналитический метод - суть заключается в подстановки значения генератора случайных чисел в некоторую функцию. Для нахождения функции необходимо решить уравнение F(x) = s, где F(x) – Ваше распределение, s – значение генератора случайных чисел.
Для примера, возьмём экспоненциальное распределение:
alt text
В пункте 2 логарифмируем выражение. Выражения 3 и 4 эквиваленты с точки зрения теории вероятностей, поскольку случайные величины s и (1-s) распределены по одному и тому же равномерному закону в интервале (0;1).
Преимущества
Высокая точность;
Не требуется память под хранение таблицы (в отличие от табличного метода).
Недостатки
Требует много вычислительных ресурсов (логарифм раскладывается в ряд);
Применим только для функций, у которых можно вычислить интеграл аналитически.
Табличный метод – заключается в формировании таблицы содержащий пары чисел: значение функции распределения генератора случайных чисел и соответствующее ему значение. Значения между узлами обычно рассчитывается линейной интерполяцией.
Преимущества
Можно построить таблицу для формирования любого закона распределения;
Можно обеспечить любую точность;
Мало процессорного времени тратится на обработку.
Недостатки
Затраты памяти на хранение таблицы;
Наличие погрешности, в результате применения линейной интерполяции;
В некоторых отрезках, функция может резко изменяться, вследствие чего необходимо подбирать оптимальный шаг.
Гг код,но всё же.. ///если конечно правильно смысл понял
$r=random(1,100);
if($r<=15){1} //вероятность 15 из 100
else
if($r<=25 and $r>15){2} //вероятность 25 из 100
else
if($r<=85 and $r>25){3} //вероятность 85 из 100
else {4}
Лорд, Хороший вариант но этот код подойдеть только эсли в массиве 1 или 2 вероятностей. Этот код не будеть работать эсли значения процентов равен или близко к друг-другу. Например как реализоват это $r = array(1=>25,2=>25,3=>10,4=>10,5=>30);
Tamerlan, ну почему же?внутри просто ещё раз random(значения вероятности)