如何选择与特定百分比机会相关的PHP变量?

时间:2011-04-21 01:16:10

标签: php variables random 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%的时间可以使用该脚本。

但是......我不希望单个数字的简单加权机会函数。我希望它从n个百分比中选择哪个百分比= true(当n =数组中的值的数量时)。这样,返回为true的百分比将与levelname相关,以便我可以选择它(或者至少这是我正在尝试做的事情)。

另外,为了澄清:所选的记录将在其中一个字段中包含唯一信息(这是$array中我之前查询过表的唯一值之一)。然后我想用该值更新另一个表(a_table)。

所以你看,我唯一不能理解的是百分比机会选择功能......这对我来说非常复杂,而且我可能会以一种非常圆润的方式进行,所以如果还有另一种方法,我肯定会尝试一下。 我得到的答案是:我现在就开始行动,看看我能做些什么。感谢您的输入=)**

2 个答案:

答案 0 :(得分:0)

$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。

答案 1 :(得分:0)

我想我明白你在问什么。如果我理解正确,“百分比机会”是应该选择记录的频率。为了确定这一点,您必须在每次使用记录时通过递增值来实际跟踪何时选择记录。关于你正在做什么没有任何“随机”,所以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%的时间。