根据权重百分比从数组生成随机变量

时间:2013-09-12 23:55:38

标签: php arrays

我有以下代码:

<?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岁。

3 个答案:

答案 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的比例低于MaleFemale大于20,因此呈现U的条件将始终为Male和{{1}生成也。因此,使用此算法,您将永远不会获得值Female

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