Как я могу выбрать переменную PHP, которая относится к определенному процентному шансу?

#php #variables #random #foreach

#php #переменные #Случайный #foreach

Вопрос:

Я изо всех сил пытаюсь разобраться в том, что я здесь делаю, но сталкиваюсь с некоторыми трудностями… Буду признателен за любую помощь или направление.

Итак, у меня есть некоторые значения в таблице, которые я извлек в соответствии с массивом (блестяще названным $ array) Я предопределил. Вот как я это сделал:

 foreach ($array as $value) {

$query = "SELECT * FROM b_table WHERE levelname='$value'";
$result = runquery($query);
$num = mysql_numrows($result);

$i=0;
while ($i < 1) {
$evochance=@mysql_result($result,$i,"evochance");  // These values are integers that will add up to 100. So in one example, $evochance would be 60, 15 and 25 if there were 3 values for the 3 $value that were returned.
$i  ;
}
  

Теперь я не могу понять, куда идти дальше. $ evochance представляют процентные шансы, которые связаны с каждым значением $.
Допустим, с помощью какой-либо функции выбрана переменная с благоприятным значением 60%, затем она вставит значение $, с которым она связана, в другую таблицу.

Я знаю, что это не поможет, но максимум, что я придумал, это:

 if (mt_rand(1,100)<$evochance) {
$valid = "True";
} 
else {
$valid = "False";
}
echo "$value chance: $evochance ($valid)<br />n"; // Added just to see the output.
  

Ну, это, очевидно, не то, что я ищу. И я действительно не могу получить динамическое количество процентов с помощью этого метода. Кроме того, это иногда выводит значение False для обоих, а в других случаях — значение True для обоих.

Итак, я любитель, изучающий основы, и я попробовал это. Приветствуется любое направление. Спасибо =)


** Правка 3 (очищена):

@cdburgess Прошу прощения за мои слабые объяснения; я тоже пытаюсь это понять. Надеюсь, вы сможете разобраться в этом.

Пример того, что находится в моем массиве: $array = array('one', 'two', 'three')

Ну, допустим, в $array , как указано выше, есть 3 значения (хотя это не всегда будет 3 при каждом запуске этого скрипта). Я собираю все записи из таблицы, которые содержат эти значения в определенном поле (называемом ‘levelname’). Поскольку эти значения уникальны для каждой записи, она будет извлекать только столько записей, сколько в них значений. Теперь каждая запись в этой таблице имеет поле с именем evochance . В этом поле находится единственное число от 1 до 100. 3 записи, которые я запрашивал ранее (в пределах foreach () ), будут иметь evochance числа, которые в сумме равны 100. Нужная мне функция решает, какую запись я буду использовать, на основе номера ‘evochance’, который она содержит. Если оно равно 99, то я хочу, чтобы оно использовалось в 99% случаев при запуске этого скрипта.

ОДНАКО… Мне не нужна простая функция взвешенного шанса для одного числа. Я хочу, чтобы он выбирал, какой процент = true из n процентов (когда n = количество значений в массиве). Таким образом, процент, возвращаемый как true, будет относиться к levelname , чтобы я мог его выбрать (или, по крайней мере, это то, что я пытаюсь сделать).

Также, для пояснения: выбранная запись будет содержать уникальную информацию в одном из своих полей (это одно из уникальных значений из $array , с помощью которого я запрашивал таблицу ранее). Затем я хочу ОБНОВИТЬ другую таблицу (a_table) этим значением.

Итак, вы видите, единственное, что я не могу понять, это функция выбора процентного шанса… Для меня это довольно сложно, и я, возможно, буду действовать обходным путем, поэтому, если есть альтернативный способ, я бы обязательно попробовал. К ответу, который я получил: я пробую это сейчас и смотрю, что я могу сделать. Спасибо за ваш вклад =)**

Комментарии:

1. Какого фактического конечного результата вы хотите достичь? Т.е. высокоуровневое описание того, чего должен достичь весь этот код. Если это просто подтасовка чисел, вы, вероятно, можете сделать то же самое полностью в базе данных с помощью одного запроса.

2. Первое изменение: экранируйте свой ввод в MySQL!

3. @Deal Я вижу много, много предлагаемых изменений 🙂

4. Когда это выполняется, я хочу, чтобы оно обновило поле в отдельной таблице значением levelname, которое соответствует проценту, который выводится как true … если это имеет смысл.

5. @Delan: Используя mysql_escape_string() ? D:

Ответ №1:

Я думаю, я понимаю, о чем вы спрашиваете. Если я правильно понимаю, «процентная вероятность» — это то, как часто следует выбирать запись. Чтобы определить это, вы должны фактически отслеживать, когда выбрана запись, увеличивая значение каждый раз, когда используется запись. В том, что вы делаете, нет ничего «случайного», поэтому функция mt_rand () или rand () не подходит.

Вот что я предлагаю, если я правильно понял. Я упрощу код для удобства чтения:

 <?php

$value = 'one';   // this can be turned into an array and looped through
$query1 = "SELECT sum(times_chosen) FROM `b_table` WHERE `levelname` = '$value'";
$count =  /* result from $query1 */
$count = $count   1; // increment the value for this selection

// get the list of items by order of percentage chance highest to lowest
$query2 = "SELECT id, percentage_chance, times_chosen, name FROM `b_table` WHERE `levelname` = '$value' ORDER BY percentage_chance DESC";
$records = /* results from query 2 */
// percentage_chance INT (.01 to 1) 10% to 100%
foreach($records as $row) {
    if(ceil($row['percentage_chance'] * $count) > $row['times_chosen']) {
        // chose this record to use and increment times_chosen
        $selected_record = $row['name'];
        $update_query = "UPDATE `b_table` SET times_chosen = times_chosen   1 WHERE id = $row['id']";
        /* run query against DB */
        // exit foreach (stop processing records because the selection is made)
        break 1;
    }
}

// check here to make sure a record was selected, if not, then take record 1 and use it but
// don't forget to increment times_chosen

?>
  

Это должно объясняться само собой, но в двух словах, вы сначала указываете процедуре упорядочивать записи базы данных по наибольшему процентному шансу. Затем, если процентный шанс больше общего, пропустите его и перейдите к следующей записи.

ОБНОВЛЕНИЕ: Итак, учитывая этот набор записей:

 $records = array(
    1 => array(
        'id' => 1001, 'percentage_chance' => .67, 'name' => 'Function A', 'times_chosen' => 0,
    ),
    2 => array(
        'id' => 1002, 'percentage_chance' => .21, 'name' => 'Function A', 'times_chosen' => 0,
    ),
    3 => array(
        'id' => 1003, 'percentage_chance' => .12, 'name' => 'Function A', 'times_chosen' => 0,
    )
);
  

Запись 1 будет выбираться в 67% случаев, запись 2 — в 21% случаев и запись 3 — в 12% случаев.

Комментарии:

1. Спасибо — это помогло тоннам. Это работает более или менее так, как я хотел — ты звезда!

2. Рад помочь! Мне потребовалось немного поработать, чтобы понять, но, думаю, я наконец-то добрался туда. 😉

Ответ №2:

 $sum = 0;
$choice = mt_rand(1,100);
foreach ($array as $item) {
    $sum  = chance($item); // The weight of choosing this item
    if ($sum >= $choice) {
        // This is the item we have selected
    }
}
  

Если я вас правильно понял, вы хотите выбрать один из элементов из массива с некоторой вероятностью выбора каждого из них. Этот метод сделает это. Убедитесь, что сумма вероятностей равна 100.