Добрый день.Можете помочь?Не могу понять как работает шанс выпадения? Например есть Хлеб, Вода, Масло,Чай. Хотелось бы сделать шанс выпадения, данные будут браться из бд! Например Хлеб: 30% Вода: 20% Масло: 5% Чай: 80%
ну напишите 30 раз слово "хлеб", 20 раз слово "вода" и т.д. Получится массив из 100 значений. По нему делаете рандомный поиск.
как по мне он имеет ввиду 80% это шанс выпадения значени. И чем выше шанс тем вероятней выпадет. Как реализовать идей нет.
Не веселые шансы. Так и голодным можно остаться. 80+30+20+5 = ххх rand(1, xxx) = чай или по отдельности нужно?
Реально, если это проценты, то почему сумма больше 100? ))) Пытаюсь представить задачу графически: 1D пространство есть отрезок на прямой. Окладываем на нём 30, 20, 5 и 80 в произвольных единицах измерения: в сумме 135. Представим, что есть некий случайный механизм, ставящий точку на этом отрезке. Механизм выдает только целые числа! Плотность заполнения точками примерно равномерная, т.е. на малом количестве попыток конечно может оказаться, что все точки, скажем, в третьем отрезке (5 единиц) и это нормально! Но на больших числах вероятность попадания в этот отрезок будет примерно как 5/135. Сделаю за тебя эту курсовую, так и быть! На PHP: У нас есть входящие параметры: "вероятности" как массив имя => относительная_вероятность (целое число): PHP: $probability = [ 'Хлеб' => 30, 'Вода' => 20, 'Масло' => 5, 'Чай' => 80 ]; Создадим мишень для стрельбы случайными числами - массив размера равного сумме вероятностей - заполним его указанием на цели. PHP: $target = []; foreach ($probability as $k => $v) { $target = array_merge( $target, array_fill(0, $v, $k) ); } $len = count($target); В переменной $len у нас общая длина отрезка, в нашем частном случае это 135. "Случайный выстрел" должен быть в диапазоне от 0 до $len-1. А попадание в цель находится как PHP: $x = $target[ mt_rand(0, $len-1) ]; Это будет словесное наименование как 'Хлеб', 'Вода' и т.д. с вероятностью случая заданной исходным массивом $probability. Тест: Устроим стрельбу, скажем, из 10000 выстрелов. Замерим процент попадания в каждую цель. PHP: $results = []; for ($i=0; $i < 10000; $i++) { $x = $target[ mt_rand(0, $len-1) ]; if (isset($results[$x])) { $results[$x]++; } else { $results[$x] = 1; } } $total = array_sum($results); echo $total."\n"; foreach ($probability as $k => $v) { $pct = ($results[$k] / $total) * 100; echo "{$k} => {$v}, {$pct}%\n"; } В $total сумма выстрелов, чисто для проверки (это 10000). Для каждой цели будет выведен "вес" в произвольных входных единицах и фактический %% попадания в тестовой серии. Конец.
Заполнять массив не благородное дело в первом foreach суммируем $v дальше $rand = rand(1, $sum) и второй foreach с проверками Нужно тестить PHP: $pos = 1; $res = ''; foreach($probability as $k => $v) { if($rand >= $pos && $rand <= $v) { $res = $k; break; } $pos += $v; }
PHP: $probabilities = [ 'Хлеб' => 30, 'Вода' => 20, 'Масло' => 5, 'Чай' => 80, 'Модератор Гей' => 120 ]; $extractProbability = function($randomIsAPower) use($probabilities){ $propbabilityMax = 0; foreach($probabilities as $name => $chance) if(($propbabilityMax += $chance) >= $randomIsAPower) return $name; }; $maxRange = array_sum($probabilities); $results = array_fill_keys(array_keys($probabilities), null); $generations = 10000; for($i=0;$i<$generations;$i++){ $results[$extractProbability(rand(1,$maxRange))]++; } foreach($results as $name=>$total){ print $name . ' total '.$total.' with '.number_format(($total / $generations * 100), 2, '.', ''). '%' .PHP_EOL; } --- Добавлено --- @artoodetoo PHP: array_fill(0, $v, $k)
Покушал вернулся смотрю все таки накосячил. Не быть мне пихапистом PHP: $probability = [ 'Хлеб' => 30, 'Вода' => 20, 'Масло' => 5, 'Чай' => 80 ]; $sum = 0; foreach($probability as $k => $v) $sum += $v; $rand = rand(0, $sum); $pos = 0; $res = ''; foreach($probability as $k => $v) { $next_pos = $pos + $v; if($rand >= $pos && $rand <= $next_pos) { $res = $k; break; } $pos = $next_pos; } echo $res;
Все таки заставили проверить. Вот работает http://sandbox.onlinephpfunctions.com/code/3034f483ebaf3bca9edba825cb0018f797365346
Да работает. Вроде как.Вопрос Как впилить сюды? PHP: <? if (!defined('DATALIFEENGINE')) exit; define('RANDOM', ENGINE_DIR . '/modules/random'); require_once RANDOM . '/config.php'; $db->super_query("SET NAMES 'utf8'"); header('Content-Type: application/x-javascript; charset=utf8'); mysqli_set_charset($db, "utf8"); $box = isset($_GET['box']) ? ($_GET['box'] > 0 ? (int) $_GET['box'] : 0) : 0; $playername = empty($member_id['name']) ? '' : $member_id['name']; $boxcount = $db->query('SELECT COUNT(*) FROM ' . BOX . ' WHERE id = "' . $box . '"'); $boxcount = $boxcount->fetch_row(); $itemcount = $db->query('SELECT COUNT(*) FROM ' . ITEM . ' WHERE id_box = ' . $box . ''); $itemcount = $itemcount->fetch_row(); $q = $db->query('SELECT server, item_name, item_price FROM `' . BOX . '` WHERE id = ' . $box . ''); $item = $db->get_row($q); $q1 = $db->query('SELECT `' . $conf['rub']['cash'] . '` FROM `' . $conf['rub']['table'] . '` WHERE `' . $conf['rub']['name'] . '` = "' . $playername . '"'); $rub = $db->get_row($q1); $q2 = $db->query('SELECT `' . $conf['money']['balance'] . '` FROM `' . $conf['money']['table'] . '` WHERE `' . $conf['money']['username'] . '` = "' . $playername . '"'); $money = $db->get_row($q2); //Лесенка счастья:) \/\/ 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 ); switch ($r['type']) { case "pokemon": $db->query(' INSERT INTO `' . $conf['sc']['table'] . '`( `' . $conf['sc']['type'] . '`, `' . $conf['sc']['player'] . '`, `' . $conf['sc']['item'] . '`, `' . $conf['sc']['extra'] . '`, `' . $conf['sc']['amount'] . '`, `' . $conf['sc']['server'] . '` ) VALUES ( "' . $r["type"] . '", "' . $playername . '", "' . $r["item"] . '", "' . $r["extra"] . '", "' . $r["count"] . '", "' . $item['server'] . '" )', $connect) or die('Возникла ошибка начисления покемона. Обратитесь к администратору! ' . mysqli_error()); break; case "item": $itemid = empty($r["item"]) ? 0 : str_replace('.', ':', $r["item"]); $db->query(' INSERT INTO `' . $conf['sc']['table'] . '`( `' . $conf['sc']['type'] . '`, `' . $conf['sc']['player'] . '`, `' . $conf['sc']['item'] . '`, `' . $conf['sc']['extra'] . '`, `' . $conf['sc']['amount'] . '`, `' . $conf['sc']['server'] . '` ) VALUES ( "' . $r["type"] . '", "' . $playername . '", "' . $itemid . '", "' . $r["extra"] . '", "' . $r["count"] . '", "' . $item['server'] . '" )', $connect) or die('Возникла ошибка начисления предмета. Обратитесь к администратору! ' . mysqli_error()); break; case "rub": $add_balance = intval(($rub[$conf['rub']['cash']]) - $item['item_price']) + $r["count"]; $db->query('UPDATE `' . $conf['rub']['table'] . '` SET `' . $conf['rub']['cash'] . '` = "' . $add_balance . '" WHERE `' . $conf['rub']['name'] . '` = "' . $playername . '"') or die('Возникла ошибка при начислений денег. Обратитесь к администратору! ' . mysql_error($connect)); break; case "money": $add_money = intval($money[$conf['money']['balance']]) + $r["count"]; $db->query('UPDATE `' . $conf['money']['table'] . '` SET `' . $conf['money']['cash'] . '` = "' . $add_money . '" WHERE `' . $conf['money']['name'] . '` = "' . $playername . '"') or die('Возникла ошибка при начислений денег. Обратитесь к администратору! ' . mysql_error($connect)); break; case "permgroup": // Нужно сделать запрос! break; default: $n = array( 'status' => false, 'text' => 'Возникла ошибка начисления выгрыша. Обратитесь к администратору!' ); echo json_encode($n); exit; } echo json_encode($n); exit; } else { $n = array( 'status' => false, 'text' => 'Недостаточно денег на балансе.' ); echo json_encode($n); exit; } } else { $n = array( 'status' => false, 'text' => 'Ты слепой видишь написано нету товара, зайди позже!' ); echo json_encode($n); exit; } } else { $n = array( 'status' => false, 'text' => 'Несуществующий сундук.' ); echo json_encode($n); exit; } } else { $n = array( 'status' => false, 'text' => 'А где сундук то?' ); echo json_encode($n); exit; } } else { $n = array( 'status' => false, 'text' => 'Войдите в магазин чтобы открыть кейс!' ); echo json_encode($n); exit; }
Как-нибудь, например. Сделать чайку, сесть за кампуктер, развернуть notepad++ и закодить черт тебя дери. Или подготовить бабло.
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, 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->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 = '<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 "money": $content = '<img src="' . $r['img'] . '" width="128px" height="128px">'; $tpl->set('{item}', $content); break; case "rub": $content = '<img src="' . $r['img'] . '" width="128px" height="128px">'; $tpl->set('{item}', $content); break; case "permgroup": $content = '<img src="' . $r['img'] . '" width="128px" height="128px">'; $tpl->set('{item}', $content); break; default: $content = '<img src="/templates/Default/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('<b>Ошибка</b>', 'Войдите чтобы просмотреть содержимое сундука.'); } } 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); } ?>