За последние 24 часа нас посетил 36781 программист и 7753 робота. Сейчас ищут 1722 программиста ...

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

Тема в разделе "PHP для новичков", создана пользователем Дюран, 27 окт 2023.

  1. Дюран

    Дюран Активный пользователь

    С нами с:
    9 мар 2018
    Сообщения:
    291
    Симпатии:
    21
    Приветствую.
    Есть например массив
    Код (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)
    Или поизящней?
    Спасибо
     
  2. Drunkenmunky

    Drunkenmunky Старожил

    С нами с:
    12 авг 2020
    Сообщения:
    1.511
    Симпатии:
    284
    Создайте новый массив, и заполните его значениями: 0 - 5 штук, 1 - 200 штук, 2 - 305 штук ...
    Перемешайте извлеките один. Можно случайный
     
  3. Дюран

    Дюран Активный пользователь

    С нами с:
    9 мар 2018
    Сообщения:
    291
    Симпатии:
    21
    выглядит очень ресурсоемко. Может функция shuffle и быстрая, но под капотом случайный порядок всех элементов обеспечивает
     
  4. Drunkenmunky

    Drunkenmunky Старожил

    С нами с:
    12 авг 2020
    Сообщения:
    1.511
    Симпатии:
    284
    Ну, можно и не перемешивать. rand() сейчас достаточно случайный
     
  5. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.874
    Симпатии:
    753
    Адрес:
    Татарстан
    непонятна формулировка .....
    что значит - какой ход сделать?
    ну если нужен любой ... это случайный элемент массива,
    PHP:
    1. echo $array[rand(COUNT($array)]
    если нужен ход с максимальной вероятностью - находите макс. значение - вот вам и ход
    PHP:
    1. $max = MAX($array);
    2. $index = array_flip($array)[$max];
    3. echo $array[$index)]
    если нужен ход с минимальной вероятностью - то же самое что с максимумом - только минимум
     
  6. Дюран

    Дюран Активный пользователь

    С нами с:
    9 мар 2018
    Сообщения:
    291
    Симпатии:
    21
    Любой нет. Эти ходы не равновероятностны.

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

    Drunkenmunky Старожил

    С нами с:
    12 авг 2020
    Сообщения:
    1.511
    Симпатии:
    284
    Как вы себе это представляете?
    Вам нужен один из тысячи вариантов.
    Вероятность вы рассчитали по матану, а сам ход матан за вас не сделает.
     
  8. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    947
    Симпатии:
    147
    Перец хотя бы задачу чётко описал, но тут ни матан, ни тервер не работають, нужен алгоритм
     
  9. rr33rr

    rr33rr Активный пользователь

    С нами с:
    6 май 2021
    Сообщения:
    35
    Симпатии:
    18
    Можно вроде такого:
    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 #", ($i-1), "<br>";
    20.  
    21. ?>
     
    #9 rr33rr, 30 окт 2023
    Последнее редактирование: 30 окт 2023
    Дюран нравится это.
  10. Дюран

    Дюран Активный пользователь

    С нами с:
    9 мар 2018
    Сообщения:
    291
    Симпатии:
    21
    @rr33rr, да, думаю что то типа. За функцию lcg_value спасибо, про нее не знал