0

我有以下代码:

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

?>

但是,当我运行它时,有时会得到:

男女U

或者:

女U

我为 $gender 数组设置了值,并希望根据给定的百分比生成性别,即在本例中:男性 30,女性 50,未知 20。

4

3 回答 3

0

这意味着所有这些项目都达到了需要回显的值,但您并没有在两者之间划清界限。

if($current > $rand) {
    echo $key . "<br>";
}

尝试这样做,以便它们显示在新行上。从那里我们可以进行数学运算。

于 2013-09-12T23:59:20.960 回答
0

显示变量时需要停止循环。

foreach ($gender as $key=>$value)
{
    $current += $value;
    if ($current > $rand)
    {
        echo $key;
        break; // Terminate the loop
    }
}
于 2013-09-13T00:10:11.150 回答
0

rand将是范围内的值,1..100因为您正在对数组中的值求和。因此,在foreach循环中,每当 `rand 生成一个足够小的值以打印出所有值时,您将打印出所有值。

例如,假设$rand= 1,那么$current将始终大于 $rand,因为它只能作为最低值有 20。

所以,是的,你很可能不想在那里投入一点break

随意的想法

我对这段代码中的逻辑有点怀疑,但是这会给你一个正确的百分比吗?也就是说,当您运行此程序时,有 20% 的时间是性别U等?在我看来,有些东西很可疑。

  • 检查百分比的更好方法(实验性)*

使用当前的解决方案,我认为您不会得到 20% U、30% 男性和 50% 女性的分布。由于 U 的百分比低于Male并且Female在您的算法中大于 20,因此渲染的条件U将始终为Maleand生成 true Female。因此,使用此算法,您将永远无法获得 value U

我建议使用范围更简单的方法,例如 1-20 = U、21-50 = 男性和 51 - 100 = 女性,顺序并不重要,只是范围等于百分比。然后检查它在哪个范围内只是一件小事rand

于 2013-09-13T00:14:43.093 回答