Как выбрать переменную PHP, относящуюся к определенному процентному шансу? - PullRequest
0 голосов
/ 21 апреля 2011

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

Итак, у меня есть некоторые значения в таблице, которую я извлек в соответствии с массивом (блестяще названным $ 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 = количество значений в массиве). Таким образом, процент, который возвращается как истинный, будет относиться к levelname, поэтому я могу выбрать его (или, по крайней мере, это то, что я пытаюсь сделать).

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

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

Ответы [ 2 ]

0 голосов
/ 21 апреля 2011

Мне кажется, я понимаю, о чем вы спрашиваете.Если я правильно понимаю, «процентный шанс» - это то, как часто следует выбирать запись.Чтобы определить это, вы должны отслеживать, когда выбрана запись, увеличивая значение при каждом использовании записи.В том, что вы делаете, нет ничего «случайного», поэтому функция 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% времени.

0 голосов
/ 21 апреля 2011
$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.

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