За последние 24 часа нас посетили 19111 программистов и 1703 робота. Сейчас ищут 1253 программиста ...

Работа с вероятностью PHP

Тема в разделе "PHP для новичков", создана пользователем Евгений Владимирович, 29 мар 2024.

  1. Евгений Владимирович

    Евгений Владимирович Активный пользователь

    С нами с:
    3 май 2009
    Сообщения:
    32
    Симпатии:
    0
    $imgnum = rand(1,29)
    Есть функция
    Как сделать чтобы число 6
    Выпадало в три раза чаще остальных
    $koefficient = 3
    Думаю добавить условие если.
    Если не 6, то снова рандом
    И так количество раз указанное в коэффициенте ?
    Ну а если нужна будет вероятность нескольких других чисел ?
    Как это можно сделать
    Кто подскажет
    Я вывожу картинки героев в шапке сайта
    И я бы хотел чтобы чаще других выпадали числа например 6,10,18
     
  2. Aleksandr.B

    Aleksandr.B Новичок

    С нами с:
    2 фев 2023
    Сообщения:
    158
    Симпатии:
    41
    Адрес:
    Барнаул
    Помотри решение Максима Федорова
    qna.habr.com/q/765171
     
    artoodetoo нравится это.
  3. Евгений Владимирович

    Евгений Владимирович Активный пользователь

    С нами с:
    3 май 2009
    Сообщения:
    32
    Симпатии:
    0
    Получился следующий код
    <?php
    $values = [
    ['value' => '1', 'weight' => 10],
    ['value' => '2', 'weight' => 20],
    ['value' => '3', 'weight' => 30],
    ['value' => '4', 'weight' => 30],
    ['value' => '5', 'weight' => 40],
    ['value' => '6', 'weight' => 50],
    ['value' => '7', 'weight' => 60],
    ['value' => '8', 'weight' => 70]

    ];

    function randByWeight(array $arr) {
    $max = 0;
    $result = [];
    foreach($arr as $value) {
    $rand = pow((mt_rand() / (mt_getrandmax() + 1)), 1/$value['weight']);
    if ($rand > $max) {
    $max = $rand;
    $result = $value;
    }
    }

    return $result;
    }



    // Например: 'Three' выпадет в 50% случаев, тк его вес -- половина от суммы всех весов
    // Например: 'Two' выпадет в 30% случаев, тк его вес -- 30% от суммы всех весов
    var_dump(randByWeight($values));

    ?>

    Выводит следующее:

    array(2) { ["value"]=> string(1) "8" ["weight"]=> int(70) }

    А как сделать чтобы выводил просто цифру?
     
  4. don.bidon

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

    С нами с:
    28 мар 2021
    Сообщения:
    914
    Симпатии:
    143
    голову подключить, не?
     
  5. Евгений Владимирович

    Евгений Владимирович Активный пользователь

    С нами с:
    3 май 2009
    Сообщения:
    32
    Симпатии:
    0
    Пробовал
    Echo $value
    Echo $values
    Echo $result
     
  6. Евгений Владимирович

    Евгений Владимирович Активный пользователь

    С нами с:
    3 май 2009
    Сообщения:
    32
    Симпатии:
    0
    Заменил на print_r
    Array ( [value] => 3 [weight] => 30 )
    Как вывести значение value
     
  7. don.bidon

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

    С нами с:
    28 мар 2021
    Сообщения:
    914
    Симпатии:
    143
    омг
    PHP:
    1. $result = randByWeight($values);
    2. var_dump($result['value']);
    синтаксис ЯП выучи уже )
     
  8. Евгений Владимирович

    Евгений Владимирович Активный пользователь

    С нами с:
    3 май 2009
    Сообщения:
    32
    Симпатии:
    0
    $result=randByWeight($values);
    Echo $result['value'];

    И заработало
     
  9. Евгений Владимирович

    Евгений Владимирович Активный пользователь

    С нами с:
    3 май 2009
    Сообщения:
    32
    Симпатии:
    0
    Теперь нужно изменить скрипт, чтобы работал под php до 5.2.17
    Иначе сайт не работает под более высокие версии!
    Ругается на вторую строку: $values = [

    mod_fcgid: stderr: PHP Parse error: syntax error, unexpected '[' in /var/www/vhosts/st-312/vote.php on line 2
    Пробовал менял [ на {
    Не помогло.
    Что там нужно изменить, чем не понравились эти скобки
    Можно как-то немного переделать, чтобы заработало под 5.2.17
     
  10. Евгений Владимирович

    Евгений Владимирович Активный пользователь

    С нами с:
    3 май 2009
    Сообщения:
    32
    Симпатии:
    0
    Ввел array ()
    Получил
    <?php
    $values = array(
    'value' => '1', 'weight' => 10,
    'value' => '2', 'weight' => 20,
    'value' => '3', 'weight' => 30,
    'value' => '4', 'weight' => 30,
    'value' => '5', 'weight' => 40,
    'value' => '6', 'weight' => 50,
    'value' => '7', 'weight' => 60,
    'value' => '8', 'weight' => 70
    );

    function randByWeight(array $arr) {
    $max = 0;
    $result = array();
    foreach($arr as $value) {
    $rand = pow((mt_rand() / (mt_getrandmax() + 1)), 1/$value['weight']);
    if ($rand > $max) {
    $max = $rand;
    $result = $value;
    }
    }

    return $result;
    }
    $result=randByWeight($values);
    Echo $result['value'];
    ?>

    Но теперь выскакивает
    mod_fcgid: stderr: PHP Warning: Division by zero in /var/www/vhosts/st-312/vote.php on line 19
    Это где-то здесь
    $result = array();
    foreach($arr as $value) {
    $rand = pow((mt_rand() / (mt_getrandmax() + 1)), 1/$value['weight']);
    if ($rand > $max) {
    $max = $rand;
    $result = $value;
    }
    }
    Division by zero - как вообще победить ошибку.В какую сторону искать?
     
  11. Aleksandr.B

    Aleksandr.B Новичок

    С нами с:
    2 фев 2023
    Сообщения:
    158
    Симпатии:
    41
    Адрес:
    Барнаул
    PHP:
    1. $values = array(
    2.     array('value' => '1', 'weight' => 10),
    3.     array('value' => '2', 'weight' => 20),
    4.     array('value' => '3', 'weight' => 30),
    5.     array('value' => '4', 'weight' => 30),
    6.     array('value' => '5', 'weight' => 40),
    7.     array('value' => '6', 'weight' => 50),
    8.     array('value' => '7', 'weight' => 60),
    9.     array('value' => '8', 'weight' => 70)
    10. );
     
  12. don.bidon

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

    С нами с:
    28 мар 2021
    Сообщения:
    914
    Симпатии:
    143
    Не рекомендуется под столь древними версиями сайты запускать.
     
  13. Евгений Владимирович

    Евгений Владимирович Активный пользователь

    С нами с:
    3 май 2009
    Сообщения:
    32
    Симпатии:
    0
    С
    Согласен
    Но на сайте ОЧЕНЬ много модулей
    Плюс связка Dle+bulletin
    Плюс модули репутации, подарков, ачивок, разные связки с форумом, последнее на форуме, разные блоки.
    Там при небольшом то обновлении Dle - то ява скрипты не работают, то в админ панель не зайти
    Куча всего понамешано
    Повышу php до 5.5- перестанет
    Работать форум с модулями.
    Всё нужно сразу и одновременно переписывать. А денег проект не приносит
     
  14. Дюран

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

    С нами с:
    9 мар 2018
    Сообщения:
    285
    Симпатии:
    21
    Смотрите чтобы во входных данных не был weight равный нулю.

    Но решение конечно... Ни в жизни из кода не понять почему эта формула дает искомый результат.