Приветствую.
Есть например массивКод (Text):
[ 0 => 0.005, 1 => 0.2, 2 => 0.305, 3 => 0.09, 4 => 0.4, ], где индексы — это ходы, а значения — это вероятности этого хода.
Вероятности в сумме составляют единицу, они вычисляются по формуле.
Как бы вы сгенерировали, какой ход сделать?
Чтоб еще это было не ресурсоемко.Умножить все вероятности на 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:
echo $array[$index)]если нужен ход с минимальной вероятностью — то же самое что с максимумом — только минимум
Любой нет. Эти ходы не равновероятностны.
Вероятность первого хода 0.5%, а вероятность второго — 20%.
Нужен элемент случайности для моделирования поведения
Как вы себе это представляете?
Вам нужен один из тысячи вариантов.
Вероятность вы рассчитали по матану, а сам ход матан за вас не сделает.
Перец хотя бы задачу чётко описал, но тут ни матан, ни тервер не работають, нужен алгоритм
Можно вроде такого:
PHP:
<?php $arr = [ 0 => 0.005, 1 => 0.200, 2 => 0.305, 3 => 0.090, 4 => 0.400, ]; /* предполагается, что не нужно проверять, что сумма вероятностей = 1 и прочую корректность входных данных */ $i = 0; $ver = $rnd; do { $ver = $ver — $arr[$i++]; } while ($ver > 0); echo «rnd = «, $rnd, «<br>»; echo «move #», ($i—1), «<br>»; ?>
@rr33rr, да, думаю что то типа. За функцию lcg_value спасибо, про нее не знал