14

この質問がされている可能性が高いことは理解していますが、以前の質問を十分に理解していないため、それらが私が望むことを行っているかどうかを判断できません。

$fruits = array('20' => 'apple', '40' => 'orange', '40' => 'pear');

キーは、値が選択される可能性のパーセンテージです。0 から 99 までの数値を mt_rand() し、それらのパーセンテージに基づいて $fruits から値を返したいと思います。

私が探しているものを説明する方法がわからないので、私はとても混乱している可能性が非常に高い.

助けてくれてありがとう。

編集: これらの可能性に基づいて、$fruits からランダムな値が必要です:

40% の確率でオレンジ、40% の確率でナシ、80% の確率でリンゴが欲しい。

編集:さらに明確にするために、多くの回答が間違っていた(またはコードを理解していない)ため、20、40、または40だけでなく、選択した数に関係なく結果が必要でした.

4

4 に答える 4

21

まず、キーが同じであるために pear がオレンジ色を上書きするため、配列には 2 つの項目 (apple と pear) しかありません。したがって、逆の順序を使用してください。また、整数を引用符で囲まないでください。

$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}!";

100rand() 関数の値を $fruits 配列値の計算された合計に置き換えることで、プロシージャの回復力を高めることもできます。

于 2012-09-24T19:35:35.747 に答える
11

私はこのようなものがあなたが望むことをすると思います:

サンプル

(サンプルの送信ボタンを複数回クリックして、コードを再実行します)

$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 回で「ナシ」となります。

于 2012-09-24T19:37:58.860 に答える
1
  $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;
    } 
  }
于 2012-09-24T19:32:40.773 に答える
1

これには複数の道があり、それらはほとんどデータに依存しています。パーセンテージ 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];
于 2012-09-24T19:38:18.000 に答える