Приветствую. Есть например массив Код (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 и быстрая, но под капотом случайный порядок всех элементов обеспечивает
непонятна формулировка ..... что значит - какой ход сделать? ну если нужен любой ... это случайный элемент массива, PHP: echo $array[rand(COUNT($array)] если нужен ход с максимальной вероятностью - находите макс. значение - вот вам и ход PHP: $max = MAX($array); $index = array_flip($array)[$max]; 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 и прочую корректность входных данных */ $rnd = lcg_value(); /* случайное число от 0 до 1 */ $i = 0; $ver = $rnd; do { $ver = $ver - $arr[$i++]; } while ($ver > 0); echo "rnd = ", $rnd, "<br>"; echo "move #", ($i-1), "<br>"; ?>