14

我知道这个问题可能已经被问过了,但我对前面的问题的理解不足以知道他们是否按照我的意愿行事。

$fruits = array('20' => 'apple', '40' => 'orange', '40' => 'pear');

关键是价值被挑选的机会的百分比。我想 mt_rand() 一个 0 到 99 之间的数字,并根据这些百分比从 $fruits 返回一个值。

我很可能很困惑,因为我不知道如何解释我在寻找什么。

预先感谢您的帮助。

编辑:想要一个随机值来自 $fruits,基于这些机会:

我希望有 40% 的机会得到一个橙子,有 40% 的机会得到一个梨,还有 80% 的机会得到一个苹果。

编辑:为了进一步澄清,因为很多答案都弄错了,(或者我只是不理解他们的代码),无论我选择什么数字,我都需要一个结果,而不仅仅是 20、40 或 40。

4

4 回答 4

21

首先,您的数组只有两个项目(apple 和 pear),因为 pear 由于具有相同的键而覆盖了橙色。所以使用相反的顺序。另外,不要在整数周围加上引号:

$fruits = array('apple' => 20, 'orange' => 40, 'pear' => 40);

您应该选择一个随机数,然后比较数组的每个权重加上之前权重的总和,直到得到匹配:

$rand = rand(1,100);
$sum = 0;
$chosenFruit;

foreach ($fruits as $f=>$v) {
    $sum += $v;
    if ( $sum >= $rand ) {
        $chosenFruit = $f;
        break;
    }
}

echo "We have chosen the {$chosenFruit}!";

您甚至可以通过将100rand() 函数中的值替换为 $fruits 数组值的计算总和来使该过程更具弹性。

于 2012-09-24T19:35:35.747 回答
11

我认为这样的事情会做你想要的:

样本

(在示例上多次单击提交按钮以获取重新执行的代码)

$fruits = array('apple' => '20', 'orange' => '40', 'pear' => '40');

$newFruits = array();
foreach ($fruits as $fruit=>$value)
{
    $newFruits = array_merge($newFruits, array_fill(0, $value, $fruit));
}

$myFruit = $newFruits[array_rand($newFruits)];

这将创建一个数组 ( $newFruits),它是一个具有 100 个元素的数字索引数组。其中 20 个元素是“苹果”,40 个是“橙色”,40 个是“梨”。然后我们从该数组中选择一个随机索引。100 次中有 20 次得到“苹果”,100 次中有 40 次得到“橙色”,100 次中有 40 次得到“梨”。

于 2012-09-24T19:37:58.860 回答
1
  $key = rand(1,98); // rand() is inclusive of the range, hence 1-98.
  foreach( $fruits as $k => $v){
  if( $k == $key) {
    echo 'Chosen fruit is:' . $v; 
    break;
    } 
  }
于 2012-09-24T19:32:40.773 回答
1

这条路有多条路要走,它们在很大程度上取决于您的数据。使用百分比,0 - 100,您的数组中可以有 100 个项目,每个项目映射到一个百分比,或者您可以有一个分配值的分布(很像您的示例中的数组)。

假设前者,您可以使用:

$key = mt_rand(0, 100);
$fruit = isset($fruits[$key]) ? $fruits[$key] : false;

以上也可以与分布一起使用,以检查水果是否“存在”,但通常您会想要“如果百分比是<=值,则使用此水果”。可以通过以下方式完成类似的事情:

$key = mt_rand(0, 100);
$fruit = false;
foreach ($fruits as $percent => $value) {
    if ($percent <= $key) {
        $fruit = $value;
        break;
    }
}

现在,有趣的部分。如果您想要任何百分比高于价值的水果怎么办?您可以修改上述内容以将每个匹配的水果存储到一个数组中,然后从该数组中选择一个随机值:

$key = mt_rand(0, 100);
$matches = array();
foreach ($fruits as $percent => $value) {
    if ($percent <= $key) {
        $matches[] = $value;
    }
}
$select = mt_rand(0, count($matches) - 1);
$fruit = $matches[$select];
于 2012-09-24T19:38:18.000 回答