php - одностороннее гауссово распределение для случайности

1

Я понимаю, что это сложный и конкретный, но, поскольку я беден от вероятности, я думал, что попытаюсь помочь в этом.

То, что я, по сути, хочу сделать, это получить случайное число с взвешенными вероятностями, основанное на предыдущем выборе случайных чисел.

То, как я хотел бы это настроить, это. (Предположим, что первый выбор случайный и простите мой синтаксис).

$start = 3; 
$next = /* function call to get random value */

По сути, я хочу, чтобы вероятность 3 была самой высокой, 4 была второй по величине 5 чтобы быть третьей самой высокой, обертывая (по модулю некоторое число), так что 2 имеет наименьшую вероятность.

Как я могу это сделать? Я не хочу, чтобы один и тот же номер повторялся, я просто хочу более высокую вероятность его выполнения (а также более высокую вероятность того, что он будет последовательно, а не). Дайте мне знать, если требуется уточнение, но по существу с начальным выбором 3 и модулем 6, я бы хотел, чтобы вероятности следующего выбора были примерно такими:

P(3)=30%
P(4)=25%
P(5)=20%
P(0)=12.5%
P(1)=7.5%
P(2)=5%

Я не задаюсь этими конкретными вероятностями, просто их порядок - односторонняя форма кривой колокола будет приятной (особенно если встроенная функциональность ее поддерживает).

  • 0
    Если P (4) = 25% и P (2) = 5%, я думаю, что это не гауссов. Это какое-то искаженное распределение. Я думаю, что лучший способ - это определить тип дистрибутива, который вам нужен (на stats.stackexchange.com ), а затем найти способ внедрить его в PHP.
Теги:
random
probability

1 ответ

1

Здесь односторонняя гаузианская кривая колокола, рассчитанная по полярному методу Марсалья

 <?php
 function rand_polar_onesided($m = 0.0, $s = 1.0){
       do {
         do {
               $x = (float)mt_rand()/(float)mt_getrandmax();
               $y = (float)mt_rand()/(float)mt_getrandmax();

               $q = pow((2 * $x - 1), 2) + pow((2 * $y - 1), 2);
         }
         while ($q > 1);

         $p = sqrt((-2 * log($q))/$q);

         $y = ((2 * $y - 1) * $p);
         $x = ((2 * $x - 1) * $p);
         $val = $y * $s + $m
       }
       while($val < $m) // reject if the calculated value is smaller than the input

       return $val;
 }
 ?>

Применение:

 rand_polar_onesided(MEAN, STANDARD_VARIANCE);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню