在php中按重量从数组中随机取值

时间:2012-09-24 19:29:43

标签: php arrays random percentage

我知道这个问题可能已被提出,但我不能理解以前的问题,足以知道他们是否做了我想做的事。

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

关键是获取价值的几率。我想mt_rand()一个0到99之间的数字,并根据这些百分比从$ fruits返回一个值。

很可能我很困惑,因为我不知道如何解释我正在寻找的东西。

提前感谢您的帮助。

编辑:根据这些机会想要$ fruits的随机值:

我希望有40%的机会获得橘子,40%的机会获得梨,80%的机会获得苹果。

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

4 个答案:

答案 0 :(得分:16)

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

$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}!";

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

答案 1 :(得分:9)

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

sample

(在示例中多次单击提交按钮以获取重新执行的代码)<登记/>

$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分你将获得“梨”。

答案 2 :(得分:0)

  $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;
    } 
  }

答案 3 :(得分:0)

这条道路有很多道路,它们几乎取决于您的数据。使用百分比,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];