Рассчет дробной вероятности

Приветствую.
Есть например массив

Код (Text):
  1.  
  2. [
  3. 0 => 0.005,
  4. 1 => 0.2,
  5. 2 => 0.305,
  6. 3 => 0.09,
  7. 4 => 0.4,
  8. ]

, где индексы — это ходы, а значения — это вероятности этого хода.
Вероятности в сумме составляют единицу, они вычисляются по формуле.
Как бы вы сгенерировали, какой ход сделать?
Чтоб еще это было не ресурсоемко.

Умножить все вероятности на 1000, один раз сгенерировать mt_rand случайное число x от 0 до 1000, и последовательно проходить и проверять в какой промежуток попало?
Т.е. первый вариант проверяем что x попало от 0 до 5
Следующий проверяем как от (5) до (5+200)
Следующий от (5+200) до (5+200+ 305)
Или поизящней?
Спасибо

 

Создайте новый массив, и заполните его значениями: 0 — 5 штук, 1 — 200 штук, 2 — 305 штук …
Перемешайте извлеките один. Можно случайный

 

выглядит очень ресурсоемко. Может функция shuffle и быстрая, но под капотом случайный порядок всех элементов обеспечивает

 

Ну, можно и не перемешивать. rand() сейчас достаточно случайный

 

непонятна формулировка …..
что значит — какой ход сделать?
ну если нужен любой … это случайный элемент массива,

PHP:
  1. echo $array[rand(COUNT($array)]

если нужен ход с максимальной вероятностью — находите макс. значение — вот вам и ход

PHP:
  1. $max = MAX($array);
  2. $index = array_flip($array)[$max];
  3. echo $array[$index)]

если нужен ход с минимальной вероятностью — то же самое что с максимумом — только минимум

 

Любой нет. Эти ходы не равновероятностны.

Вероятность первого хода 0.5%, а вероятность второго — 20%.
Нужен элемент случайности для моделирования поведения

 

Как вы себе это представляете?
Вам нужен один из тысячи вариантов.
Вероятность вы рассчитали по матану, а сам ход матан за вас не сделает.

 

Перец хотя бы задачу чётко описал, но тут ни матан, ни тервер не работають, нужен алгоритм

 

Можно вроде такого:

PHP:
  1. <?php
  2. $arr = [
  3.   0 => 0.005,
  4.   1 => 0.200,
  5.   2 => 0.305,
  6.   3 => 0.090,
  7.   4 => 0.400,
  8. ];
  9. /* предполагается, что не нужно проверять, что сумма вероятностей = 1 и прочую корректность входных данных */
  10. $rnd = lcg_value(); /* случайное число от 0 до 1 */
  11.  
  12. $i = 0;
  13. $ver = $rnd;
  14. do {
  15.   $ver = $ver $arr[$i++];
  16. } while ($ver > 0);
  17.  
  18. echo «rnd = «, $rnd, «<br>»;
  19. echo «move #», ($i1), «<br>»;
  20.  
  21. ?>
 

@rr33rr, да, думаю что то типа. За функцию lcg_value спасибо, про нее не знал

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *