我有以下代码:
<?php
$gender = array(
'Male'=>30,
'Female'=>50,
'U' =>20);
$total = array_sum(array_values($gender));
$current = 0;
$rand = rand(1,$total);
foreach ($gender as $key=>$value)
{
$current += $value;
if ($current > $rand)
{
echo $key;
}
}
?>
然而,当我运行它时,我有时会得到:
MaleFemaleU
或者:
FemaleU
我设置了$ gender数组的值,并希望根据给定的百分比生成性别,即在这种情况下:男性30岁,女性50岁,未知20岁。
答案 0 :(得分:0)
这意味着所有这些项目都达到了回声所需的价值,但是你不能在那之间划一条线。
if($current > $rand) {
echo $key . "<br>";
}
尝试这样,它们将显示在新行上。从那里我们可以进行数学运算。
答案 1 :(得分:0)
显示变量时需要停止循环。
foreach ($gender as $key=>$value)
{
$current += $value;
if ($current > $rand)
{
echo $key;
break; // Terminate the loop
}
}
答案 2 :(得分:0)
rand
将是1..100
范围内的值,因为您要对数组中的值求和。那么在foreach
循环中,只要`rand生成一个小到足以打印出所有值的值,就会打印出所有值。
例如,假设$rand
= 1,那么$current
将始终大于$ rand,因为它只能作为最低值才有20。
所以,是的,你很可能不想在那里扔一点break
。
随机想法
我对此代码中的逻辑有点怀疑,但这会给你一个正确的百分比吗?也就是说,当您运行此性别时,有20%的时间是U
等等?对我来说看起来很腥。
根据目前的解决方案,我认为你不会得到20%U,30%男性和50%女性的分布。
由于U的比例低于Male
且Female
大于20,因此呈现U
的条件将始终为Male
和{{1}生成也。因此,使用此算法,您将永远不会获得值Female
。
我建议使用范围更简单的方法,例如1-20 = U,21-50 =男性和51-100 =女性,顺序并不重要,只是范围等于百分比。然后检查U
所在的范围只是一个小问题。