За последние 24 часа нас посетил 56861 программист и 1785 роботов. Сейчас ищут 832 программиста ...

% шанс на выпадение

Тема в разделе "PHP для новичков", создана пользователем Kela, 28 янв 2017.

  1. Kela

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

    С нами с:
    20 дек 2014
    Сообщения:
    84
    Симпатии:
    1
    Доброго времени суток. Ищу реализацию шанса рандома.
    У нас есть: Яблоко, Груша, Вишня и Персик.
    Яблоко = 30% из 100% что выпадет Яблоко при рандоме.
    Груша = 10% из 100% что выпадет Груша при рандоме.
    Вишня = 90% из 100% что выпадет Вишня при рандоме.
    Персик = 100% из 100% что выпадет Персик при рандоме.
    Как сделать рандом который учитывает % выпадения. PHP - MYSQL.
    Мой код который работает сейчас на MYSQL RAND();
    Помогите
    Код (PHP):
    1. <?
    2. //Лесенка счастья:) \/\/
    3. if (!empty($member_id['name']))
    4.   {
    5.     if (isset($_GET['box']))
    6.       {
    7.         if ($boxcount[0] == 1)
    8.           {
    9.             if ($itemcount[0] > 0)
    10.               {
    11.                 if ($item['item_price'] < $rub[$conf['rub']['cash']] or $item['item_price'] == $rub[$conf['rub']['cash']])
    12.                   {
    13.                     $new_balance = intval($rub[$conf['rub']['cash']]) - $item['item_price'];
    14.                     $db->query('UPDATE `' . $conf['rub']['table'] . '` SET `' . $conf['rub']['cash'] . '` = "' . $new_balance . '" WHERE `' . $conf['rub']['name'] . '` = "' . $playername . '"') or die('Возникла ошибка при отрытия кейса. Обратитесь к администратору! ' . mysql_error($connect));
    15.                     $result = $db->query('SELECT id FROM ' . ITEM . ' WHERE id_box = "' . $box . '"');
    16.                     $all_entries = array();
    17.                     while ($entries = $db->get_row($result))
    18.                       {
    19.                         $all_entries[] = $entries['id'];
    20.                       }
    21.                     //Находим ПРИЗ! \/\/
    22.                     $priz = $all_entries[array_rand($all_entries)];
    23.                     $q    = $db->query('SELECT type, img, name, item, count, extra FROM ' . ITEM . ' WHERE id = "' . $priz . '"');
    24.                     $r    = $db->get_row($q);
    25.                  
    26.                     //Пока оставлю потом переделаю \/\/\/
    27.                  
    28.                  
    29.                     $sql      = 'SELECT img FROM ' . ITEM . ' WHERE id_box = "' . $box . '" ORDER BY RAND()';
    30.                     //Вывод 2 последние картинки
    31.                     $win_rand = array();
    32.                     for ($i = 0; $i < 2; $i++)
    33.                       {
    34.                         $s = $db->get_row($db->query($sql));
    35.                      
    36.                         $win_rand[] = array(
    37.                             'img' => '' . $s['img'] . ''
    38.                         );
    39.                      
    40.                       }
    41.                  
    42.                  
    43.                     //Про коддинг)
    44.                     $rand = array();
    45.                     for ($i = 0; $i < 67; $i++)
    46.                       {
    47.                         $a = $db->get_row($db->query($sql));
    48.                      
    49.                         $rand[] = array(
    50.                             'img' => '' . $a['img'] . ''
    51.                         );
    52.                      
    53.                       }
    54.                  
    55.                     //:) Бог массивов
    56.                  
    57.                     $array1[] = array(
    58.                         'img' => '' . $r['img'] . '',
    59.                         'stop' => 1
    60.                     );
    61.                     $arr      = array_merge($rand, $array1);
    62.                     $arr      = array_merge($arr, $win_rand);
    63.                  
    64.                  
    65.                  
    66.                     $n = array(
    67.                         'status' => true,
    68.                         'priz' => array(
    69.                             'name' => '' . $r['name'] . '',
    70.                             'img' => '' . $r['img'] . '',
    71.                             'trade' => 0,
    72.                             'price' => $item['item_price']
    73.                         ),
    74.                         'data' => $arr
    75.                     );
    76. ?>
    --- Добавлено ---
    PHP:
    1. <?php
    2.  
    3. if(!defined('DATALIFEENGINE')) exit;
    4. define('RANDOM', ENGINE_DIR .'/modules/random');
    5. require_once RANDOM .'/config.php';
    6.  
    7. $box    = isset($_REQUEST['box']) ? ($_REQUEST['box'] > 0 ? (int) $_REQUEST['box'] : 0) : 0;
    8. $open    = isset($_POST['open']) ? ($_POST['open'] > 0 ? (int) $_POST['open'] : 0) : 0;
    9. $playername = empty($member_id['name']) ? '' : $member_id['name'];
    10.  
    11. $boxcount = $db->query('SELECT COUNT(*) FROM ' . BOX . ' WHERE id = "' . $box . '"');
    12. $boxcount = $boxcount->fetch_row();
    13.  
    14. if(!isset($_GET['box'])) {
    15.     $count = $db->query('SELECT COUNT(*) FROM ' . BOX . ''); //ПОМЕТКА: пока оставлю так потом переделаю
    16.     $c = $count->fetch_row();
    17.     $i    = 0;
    18.     $q    = $db->query('SELECT  id, server, servername, item_img, item_name, item_price FROM `' . BOX . '` ORDER BY sort LIMIT 0, ' . $c[0] . '');
    19.  
    20.     while($r = $db->get_row($q))
    21.     {
    22.         $tpl->load_template('random/random.tpl');
    23.         $tpl->set('{id}', $r['id']);
    24.         $tpl->set('{item_img}', $r['item_img']);
    25.         $tpl->set('{item_name}', $r['item_name']);
    26.         $tpl->set('{item_price}', $r['item_price']);
    27.         $tpl->set('{server}', $r['servername']);
    28.         $tpl->compile('content');
    29.         $tpl->clear();
    30.     }
    31.  
    32. } elseif($boxcount[0] > 0) {
    33.  
    34. if(!empty($member_id['name'])) {
    35.  
    36. $itemcount = $db->query('SELECT COUNT(*) FROM ' . ITEM . ' WHERE id_box = ' . $box . '');
    37. $itemcount = $itemcount->fetch_row();
    38.  
    39. $q    = $db->query('SELECT item_name, item_price FROM `' . BOX . '` WHERE id = ' . $box . '');
    40. $item = $db->get_row($q);
    41.     if($itemcount[0] > 0) {
    42.  
    43.             $q = $db->query('SELECT img, name, item, count FROM `' . ITEM . '` WHERE id_box = ' . $box . ' ORDER BY RAND()');
    44.  
    45.                 while($r = $db->get_row($q)) {
    46.                     $tpl->load_template('random/lottery-element-slider.tpl');
    47.                     $tpl->set('{img}', $r['img']);
    48.                     $tpl->compile('imgs');
    49.                     $tpl->clear();
    50.                 }
    51.                  
    52.  
    53.                 $q = $db->query('SELECT img, type, name, item, count FROM `' . ITEM . '` WHERE id_box = ' . $box . '');
    54.                 while($r = $db->get_row($q))
    55.                 {
    56.              
    57.                     switch($r['type']){
    58.                         case "pokemon":
    59.                             $content    = '<span style="color: blue; float: right;"><b>X' . $r['count'] . '</b></span>
    60.                            <img src="' . $r['img'] . '" width="128px" height="128px">';
    61.                             $tpl->set('{item}', $content);
    62.                             break;
    63.                         case "item":
    64.                             $content = '<span style="color: blue; float: right;"><b>X' . $r['count'] . '</b></span>
    65.                            <img src="' . $r['img'] . '" width="128px" height="128px">';
    66.                             $tpl->set('{item}', $content);
    67.                             break;
    68.                         case "rub":
    69.                             $content = '<span style="color: blue; float: right;"><b>X' . $r['count'] . '</b></span>
    70.                            <img src="' . $r['img'] . '" width="128px" height="128px">';
    71.                             $tpl->set('{item}', $content);
    72.                             break;
    73.                         case "permgroup":
    74.                             $content = '<span style="color: blue; float: right;"><b>X' . $r['count'] . '</b></span>
    75.                            <img src="' . $r['img'] . '" width="128px" height="128px">';
    76.                             $tpl->set('{item}', $content);
    77.                             break;
    78.                         default:
    79.                         $content = '<img src="{THEME}/random/style/img/icon/help.png" width="128px" height="128px">';  
    80.                         $tpl->set('{item}', $content);
    81.                         break;
    82.                     }
    83.                  
    84.                     $tpl->set('{name}', $r['name']);
    85.                     $tpl->load_template('random/lottery-element.tpl');
    86.                     $tpl->compile('items');
    87.                     $tpl->clear();
    88.          
    89.                 }
    90.                 $tpl->set('{box}', $box);
    91.                 $tpl->set('{item_price}', $item['item_price']);
    92.                 $tpl->set('{item_name}', strtolower($item['item_name']));
    93.                 $tpl->set('{items}', $tpl->result['items']);
    94.                 $tpl->set('{imgs}', $tpl->result['imgs']);
    95.                 $tpl->load_template('random/box.tpl');
    96.                 $tpl->compile('content');
    97.                 $tpl->clear();
    98.          
    99.             } else {
    100.             msgbox('<b>Ошибка</b>', 'Увы но товар закончился зайдите чуть позже!');
    101.         }
    102.     } else {
    103.         msgbox('', 'Войдите чтобы просмотреть содержимое сундука.');
    104.     }
    105. } else {
    106.     msgbox('<b>Ошибка</b>', 'Сундук не найден!');
    107. }
    108.  
    109. function msg($arr, $lang1, $lang2){
    110.     $keys = array();
    111.     $values = array();
    112.     foreach($arr as $key => $value){
    113.         $keys[] = $key;
    114.         $values[] = $value;
    115.     }
    116.     $message = str_replace($keys, $values, $lang2);
    117.     msgbox($lang1, $message);
    118. }
    119.  
    120. ?>
     
  2. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    @Kela эммм ну во первых персик не может иметь 100 проц тк каждый раз должен выпадать персик а следовательно остальные тогда должны иметь 0 проц.

    во вторых есть сумма шансов 30+10+90=130 делаем рандом из 130 и если результат меньше 30 то первое если больше 30 и меньше 40 то второе и так далее
    но здесь подвох в фиктивности рандома хотя это не критично
     
    denis01 нравится это.
  3. Kela

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

    С нами с:
    20 дек 2014
    Сообщения:
    84
    Симпатии:
    1
    ну если персик 100% имеет - то он и выпадет
    --- Добавлено ---
    @anderstender
     
  4. applicab

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

    С нами с:
    14 июл 2014
    Сообщения:
    73
    Симпатии:
    18
  5. Kela

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

    С нами с:
    20 дек 2014
    Сообщения:
    84
    Симпатии:
    1
    Сорян, выбыл из жизни на 2 дня. Работал.
    все бы хорошо, но процент должен браться из БД там где название предмета и т.д.
     
  6. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Тут какое дело - все вещи имеют один пул вероятностей на всех, или нет?
    Если пул вероятности один на всех, то:
    1) Сумма всех вероятностей должна быть ровно 100%.
    2) Может выпасть только одна вещь из большого списка.

    Если пул вероятности у каждого свой, то:
    1) Любой предмет может иметь любой процент от 0 до 100.
    2) Может выпасть несколько вещей одновременно.

    Это довольно важно для постановки задачи.
     
  7. anderstender

    anderstender Новичок

    С нами с:
    15 ноя 2016
    Сообщения:
    55
    Симпатии:
    25
    во первых, ты запаришься каждому предмету выставлять коэффициенты выпадения так, чтобы суммарно было 100%, а при добавлении удалении в базу всё нужно будет переставлять, а если допустим разных предметов 10000?

    я бы сделал так:
    отдельно указывал шанс, что выпадет хоть какой-то предмет (например 40%)

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

    а вот определение выпавшего предмета делал бы так:
    складывал бы сумму коэффициентов всех предметов.
    получал бы случайное число от нуля, до суммы коэффициентов.
    далее создаешь переменную-счетчик
    и в цикле для каждого предмета делаешь такую штуку
    1)стартовый интервал проверки устанавливаешь равным счетчику
    2)увеличиваешь счетчик на размер коэффициента для предмета
    3) конечный интервал проверки устанавливаешь равным счетчику
    4) если наше случайное число лежит между интервалами то текущий айтем и должен выпасть и ты тупо прерываешь цикл


    алгоритм не самый быстрый, но простой и никакого матана знать не нужно
     
  8. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    ну да и предположим что у нас сто итераций, те персик должен выпадать в каждой итерации но в таком случае яблоко не выпадет ни разу а значит оно имеет нулевой процент, а если выпадет хоть раз то значит персик имеет не 100%. Хотя @Fell-x27 правильно сказал. Задача не совсем чётко поставлена. Хотя
    обходимо.

    полагаю, что проектировка бд не оч удачна. предлагаю хранить в бд не сами проценты а дипазон 10-40-130 из моего примера что позволит выбирать предмет по диапазону не производя выборку всех предметов при запросе в бд . (ну и ессна на странице изменения предмета уже выводить чистый шанс и изменения всей бд при изменении предмета, что бывает не так часто)
     
  9. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    Ты казино какое то клепаешь?
     
  10. Kela

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

    С нами с:
    20 дек 2014
    Сообщения:
    84
    Симпатии:
    1
    суть в том что есть кейс. MineCraft.
    Например мне надо что бы каждый раз выпадал из всего списка 1 предмет - я ставлю 100% шанс что выпадет. - И все.
    9 вещей имеют 90% что выпадут.
    1 вещь имеет 10% что выпадет.
    --- Добавлено ---
    пример кода можно?
     
  11. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    Кейсы для MineKraft это тоже самое что метагейм шоп в доте 2 и вот шоп в WoT?
     
  12. Kela

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

    С нами с:
    20 дек 2014
    Сообщения:
    84
    Симпатии:
    1
    Кто может поправить код?
    Идет рандом от 0 до 100. выпадает 36 - ищем предметы которые в диапазоне от 0 до 36.(Колонка chance) между ними рандом.
     
  13. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    Надеюсь, что никто твой код для развода детей поправлять не будет. У нас высокоморальный бизнес. :cool:
     
    denis01 нравится это.
  14. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Плати денюшку - сделают)) Вот и вся мораль нашего бизнеса :D
     
  15. Kela

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

    С нами с:
    20 дек 2014
    Сообщения:
    84
    Симпатии:
    1
    То есть для развода?
     
  16. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Там суть не совсем в разводе. Обыкновенный донат. Только ты не всегда знаешь что тебе выпадет.
     
  17. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    ахахаха))))
    Ну да, там не развод, но развод.
    Ты почти всегда в минусе. Не потому, что я играл, а потому, что понимаю, как это работает.
    То же самое казино, только в профиль. Это аморальное дерьмо.
    Я такого даже за деньги делать не буду. Нахера такие деньги. Я, конечно, понимаю, что это дело попахивает откровенной субъектившиной. Но эмоции вызывает резко негативные.
     
    denis01 нравится это.
  18. Kela

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

    С нами с:
    20 дек 2014
    Сообщения:
    84
    Симпатии:
    1
    Учитывая что за 5р можно выиграть группу на месяц за 2к руб.
    Шанс на группу 20%
     
  19. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    @Kela чувак, что ты мне лечишь. Хочешь сказать ты это делаешь для того, чтобы раздавать людям деньги?
     
  20. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Я же говорю, там смысл не такой как в казино. Ты можешь заплатить за конкретный игровой предмет, а можешь за кейс, а из кейса выпадет что-то случайное. При чём, зачастую, оно будет стоить дороже чем тот же предмет в магазине. Просто ты не знаешь что тебе выпадет.
    --- Добавлено ---
    Там вообще нет вывода денег. А иначе, нужно было бы серьёзно подзаморочиться) Я б не рискнул такой проект открывать без серьёзных тестов)
     
  21. Kela

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

    С нами с:
    20 дек 2014
    Сообщения:
    84
    Симпатии:
    1
    ахахах. Причем тут деньги?
    Пошел спам.... не по теме. я вам одно вы другое.
    --- Добавлено ---
    Ты прав, например разыгрывать то что не продается, с 20% шансом на выпадение.
     
  22. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    почитай про функцию rand. Она решит все твои проблемы.
     
  23. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Поддерживаю.