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

変数を表示するときは、ループを停止する必要があります。

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

つまり、これらすべてのアイテムがエコーする必要がある値に達しているが、その間に線を引いていないことを意味します。

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

それらが新しい行に表示されるように試してください。そこから、数学に取り組むことができます。

于 2013-09-12T23:59:20.960 に答える
0

rand1..100配列内の値を合計しているため、範囲内の値になります。したがって、foreachループ内では、`rand がすべての値を出力するのに十分小さい値を生成するたびに、すべての値を出力します。

たとえば、$rand= 1 とし$currentましょう。最小値は 20 しかないため、常に $rand よりも大きくなります。

だから、ええ、おそらくそこに少し投入したくないでしょうbreak

ランダムな考え

このコードのロジックには少し疑問がありますが、これで正しいパーセンテージが得られますか? つまり、これを実行すると 20% の確率で性別が になりますU。私には何かが怪しいように見えます。

  • パーセンテージを確認するより良い方法 (実験的) *

現在のソリューションでは、20% の U、30% の男性、50% の女性という分布を得ることはできないと思います。U のパーセンテージはMaleandよりも低くFemale、アルゴリズムでは 20 より大きいため、レンダリングされる条件は、 andに対してもU常に true を生成します。したがって、このアルゴリズムでは値を取得することはありません。MaleFemaleU

たとえば、1-20 = U、21-50 = 男性、51 - 100 = 女性など、範囲を使用した簡単なアプローチをお勧めします。順序は重要ではなく、範囲がパーセンテージに等しいだけです。次に、がどの範囲にあるかを確認するのは簡単なことですrand

于 2013-09-13T00:14:43.093 に答える