Доброго времени суток. Ищу реализацию шанса рандома. У нас есть: Яблоко, Груша, Вишня и Персик. Яблоко = 30% из 100% что выпадет Яблоко при рандоме. Груша = 10% из 100% что выпадет Груша при рандоме. Вишня = 90% из 100% что выпадет Вишня при рандоме. Персик = 100% из 100% что выпадет Персик при рандоме. Как сделать рандом который учитывает % выпадения. PHP - MYSQL. Мой код который работает сейчас на MYSQL RAND(); Помогите Спойлер: Код(CORE.PHP) -не весь код. только рандом Код (PHP): <? //Лесенка счастья:) \/\/ if (!empty($member_id['name'])) { if (isset($_GET['box'])) { if ($boxcount[0] == 1) { if ($itemcount[0] > 0) { if ($item['item_price'] < $rub[$conf['rub']['cash']] or $item['item_price'] == $rub[$conf['rub']['cash']]) { $new_balance = intval($rub[$conf['rub']['cash']]) - $item['item_price']; $db->query('UPDATE `' . $conf['rub']['table'] . '` SET `' . $conf['rub']['cash'] . '` = "' . $new_balance . '" WHERE `' . $conf['rub']['name'] . '` = "' . $playername . '"') or die('Возникла ошибка при отрытия кейса. Обратитесь к администратору! ' . mysql_error($connect)); $result = $db->query('SELECT id FROM ' . ITEM . ' WHERE id_box = "' . $box . '"'); $all_entries = array(); while ($entries = $db->get_row($result)) { $all_entries[] = $entries['id']; } //Находим ПРИЗ! \/\/ $priz = $all_entries[array_rand($all_entries)]; $q = $db->query('SELECT type, img, name, item, count, extra FROM ' . ITEM . ' WHERE id = "' . $priz . '"'); $r = $db->get_row($q); //Пока оставлю потом переделаю \/\/\/ $sql = 'SELECT img FROM ' . ITEM . ' WHERE id_box = "' . $box . '" ORDER BY RAND()'; //Вывод 2 последние картинки $win_rand = array(); for ($i = 0; $i < 2; $i++) { $s = $db->get_row($db->query($sql)); $win_rand[] = array( 'img' => '' . $s['img'] . '' ); } //Про коддинг) $rand = array(); for ($i = 0; $i < 67; $i++) { $a = $db->get_row($db->query($sql)); $rand[] = array( 'img' => '' . $a['img'] . '' ); } //:) Бог массивов $array1[] = array( 'img' => '' . $r['img'] . '', 'stop' => 1 ); $arr = array_merge($rand, $array1); $arr = array_merge($arr, $win_rand); $n = array( 'status' => true, 'priz' => array( 'name' => '' . $r['name'] . '', 'img' => '' . $r['img'] . '', 'trade' => 0, 'price' => $item['item_price'] ), 'data' => $arr ); ?> --- Добавлено --- Спойлер: Код(random.PHP) PHP: <?php if(!defined('DATALIFEENGINE')) exit; define('RANDOM', ENGINE_DIR .'/modules/random'); require_once RANDOM .'/config.php'; $box = isset($_REQUEST['box']) ? ($_REQUEST['box'] > 0 ? (int) $_REQUEST['box'] : 0) : 0; $open = isset($_POST['open']) ? ($_POST['open'] > 0 ? (int) $_POST['open'] : 0) : 0; $playername = empty($member_id['name']) ? '' : $member_id['name']; $boxcount = $db->query('SELECT COUNT(*) FROM ' . BOX . ' WHERE id = "' . $box . '"'); $boxcount = $boxcount->fetch_row(); if(!isset($_GET['box'])) { $count = $db->query('SELECT COUNT(*) FROM ' . BOX . ''); //ПОМЕТКА: пока оставлю так потом переделаю $c = $count->fetch_row(); $i = 0; $q = $db->query('SELECT id, server, servername, item_img, item_name, item_price FROM `' . BOX . '` ORDER BY sort LIMIT 0, ' . $c[0] . ''); while($r = $db->get_row($q)) { $tpl->load_template('random/random.tpl'); $tpl->set('{id}', $r['id']); $tpl->set('{item_img}', $r['item_img']); $tpl->set('{item_name}', $r['item_name']); $tpl->set('{item_price}', $r['item_price']); $tpl->set('{server}', $r['servername']); $tpl->compile('content'); $tpl->clear(); } } elseif($boxcount[0] > 0) { if(!empty($member_id['name'])) { $itemcount = $db->query('SELECT COUNT(*) FROM ' . ITEM . ' WHERE id_box = ' . $box . ''); $itemcount = $itemcount->fetch_row(); $q = $db->query('SELECT item_name, item_price FROM `' . BOX . '` WHERE id = ' . $box . ''); $item = $db->get_row($q); if($itemcount[0] > 0) { $q = $db->query('SELECT img, name, item, count FROM `' . ITEM . '` WHERE id_box = ' . $box . ' ORDER BY RAND()'); while($r = $db->get_row($q)) { $tpl->load_template('random/lottery-element-slider.tpl'); $tpl->set('{img}', $r['img']); $tpl->compile('imgs'); $tpl->clear(); } $q = $db->query('SELECT img, type, name, item, count FROM `' . ITEM . '` WHERE id_box = ' . $box . ''); while($r = $db->get_row($q)) { switch($r['type']){ case "pokemon": $content = '<span style="color: blue; float: right;"><b>X' . $r['count'] . '</b></span> <img src="' . $r['img'] . '" width="128px" height="128px">'; $tpl->set('{item}', $content); break; case "item": $content = '<span style="color: blue; float: right;"><b>X' . $r['count'] . '</b></span> <img src="' . $r['img'] . '" width="128px" height="128px">'; $tpl->set('{item}', $content); break; case "rub": $content = '<span style="color: blue; float: right;"><b>X' . $r['count'] . '</b></span> <img src="' . $r['img'] . '" width="128px" height="128px">'; $tpl->set('{item}', $content); break; case "permgroup": $content = '<span style="color: blue; float: right;"><b>X' . $r['count'] . '</b></span> <img src="' . $r['img'] . '" width="128px" height="128px">'; $tpl->set('{item}', $content); break; default: $content = '<img src="{THEME}/random/style/img/icon/help.png" width="128px" height="128px">'; $tpl->set('{item}', $content); break; } $tpl->set('{name}', $r['name']); $tpl->load_template('random/lottery-element.tpl'); $tpl->compile('items'); $tpl->clear(); } $tpl->set('{box}', $box); $tpl->set('{item_price}', $item['item_price']); $tpl->set('{item_name}', strtolower($item['item_name'])); $tpl->set('{items}', $tpl->result['items']); $tpl->set('{imgs}', $tpl->result['imgs']); $tpl->load_template('random/box.tpl'); $tpl->compile('content'); $tpl->clear(); } else { msgbox('<b>Ошибка</b>', 'Увы но товар закончился зайдите чуть позже!'); } } else { msgbox('', 'Войдите чтобы просмотреть содержимое сундука.'); } } else { msgbox('<b>Ошибка</b>', 'Сундук не найден!'); } function msg($arr, $lang1, $lang2){ $keys = array(); $values = array(); foreach($arr as $key => $value){ $keys[] = $key; $values[] = $value; } $message = str_replace($keys, $values, $lang2); msgbox($lang1, $message); } ?>
@Kela эммм ну во первых персик не может иметь 100 проц тк каждый раз должен выпадать персик а следовательно остальные тогда должны иметь 0 проц. во вторых есть сумма шансов 30+10+90=130 делаем рандом из 130 и если результат меньше 30 то первое если больше 30 и меньше 40 то второе и так далее но здесь подвох в фиктивности рандома хотя это не критично
Сорян, выбыл из жизни на 2 дня. Работал. все бы хорошо, но процент должен браться из БД там где название предмета и т.д.
Тут какое дело - все вещи имеют один пул вероятностей на всех, или нет? Если пул вероятности один на всех, то: 1) Сумма всех вероятностей должна быть ровно 100%. 2) Может выпасть только одна вещь из большого списка. Если пул вероятности у каждого свой, то: 1) Любой предмет может иметь любой процент от 0 до 100. 2) Может выпасть несколько вещей одновременно. Это довольно важно для постановки задачи.
во первых, ты запаришься каждому предмету выставлять коэффициенты выпадения так, чтобы суммарно было 100%, а при добавлении удалении в базу всё нужно будет переставлять, а если допустим разных предметов 10000? я бы сделал так: отдельно указывал шанс, что выпадет хоть какой-то предмет (например 40%) затем исходя из результата броска делал бы запрос к базе не получение предметов, или же говорил что ничего не выпало. а вот определение выпавшего предмета делал бы так: складывал бы сумму коэффициентов всех предметов. получал бы случайное число от нуля, до суммы коэффициентов. далее создаешь переменную-счетчик и в цикле для каждого предмета делаешь такую штуку 1)стартовый интервал проверки устанавливаешь равным счетчику 2)увеличиваешь счетчик на размер коэффициента для предмета 3) конечный интервал проверки устанавливаешь равным счетчику 4) если наше случайное число лежит между интервалами то текущий айтем и должен выпасть и ты тупо прерываешь цикл алгоритм не самый быстрый, но простой и никакого матана знать не нужно
ну да и предположим что у нас сто итераций, те персик должен выпадать в каждой итерации но в таком случае яблоко не выпадет ни разу а значит оно имеет нулевой процент, а если выпадет хоть раз то значит персик имеет не 100%. Хотя @Fell-x27 правильно сказал. Задача не совсем чётко поставлена. Хотя обходимо. полагаю, что проектировка бд не оч удачна. предлагаю хранить в бд не сами проценты а дипазон 10-40-130 из моего примера что позволит выбирать предмет по диапазону не производя выборку всех предметов при запросе в бд . (ну и ессна на странице изменения предмета уже выводить чистый шанс и изменения всей бд при изменении предмета, что бывает не так часто)
суть в том что есть кейс. MineCraft. Например мне надо что бы каждый раз выпадал из всего списка 1 предмет - я ставлю 100% шанс что выпадет. - И все. 9 вещей имеют 90% что выпадут. 1 вещь имеет 10% что выпадет. --- Добавлено --- пример кода можно?
Кто может поправить код? Идет рандом от 0 до 100. выпадает 36 - ищем предметы которые в диапазоне от 0 до 36.(Колонка chance) между ними рандом.
ахахаха)))) Ну да, там не развод, но развод. Ты почти всегда в минусе. Не потому, что я играл, а потому, что понимаю, как это работает. То же самое казино, только в профиль. Это аморальное дерьмо. Я такого даже за деньги делать не буду. Нахера такие деньги. Я, конечно, понимаю, что это дело попахивает откровенной субъектившиной. Но эмоции вызывает резко негативные.
@Kela чувак, что ты мне лечишь. Хочешь сказать ты это делаешь для того, чтобы раздавать людям деньги?
Я же говорю, там смысл не такой как в казино. Ты можешь заплатить за конкретный игровой предмет, а можешь за кейс, а из кейса выпадет что-то случайное. При чём, зачастую, оно будет стоить дороже чем тот же предмет в магазине. Просто ты не знаешь что тебе выпадет. --- Добавлено --- Там вообще нет вывода денег. А иначе, нужно было бы серьёзно подзаморочиться) Я б не рискнул такой проект открывать без серьёзных тестов)
ахахах. Причем тут деньги? Пошел спам.... не по теме. я вам одно вы другое. --- Добавлено --- Ты прав, например разыгрывать то что не продается, с 20% шансом на выпадение.