我知道这个问题可能已被提出,但我不能理解以前的问题,足以知道他们是否做了我想做的事。
$fruits = array('20' => 'apple', '40' => 'orange', '40' => 'pear');
关键是获取价值的几率。我想mt_rand()一个0到99之间的数字,并根据这些百分比从$ fruits返回一个值。
很可能我很困惑,因为我不知道如何解释我正在寻找的东西。
提前感谢您的帮助。
编辑:根据这些机会想要$ fruits的随机值:
我希望有40%的机会获得橘子,40%的机会获得梨,80%的机会获得苹果。
编辑:为了进一步澄清,既然很多答案都弄错了,(或者我只是不理解他们的代码),无论我选择什么号码,我都需要一个结果,而不仅仅是20,40 ,或40。
答案 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)
我认为这样的事情会做你想要的:
$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];