0

関数をエコーし​​て実行するPHPコードを30%の時間だけ作成するのに助けが必要です。

現在、以下のコードがありますが、機能していないようです。

if (mt_rand(1, 3) == 2)
{
    echo '';
    theFunctionIWantCalled();
}
4

3 に答える 3

2

関数が返すものをエコーし​​ようとしていますか?それは

if(mt_rand(1,100) <= 30)
{
    echo function();
}

現在持っているものは空白のステートメントをエコーし​​てから、関数を実行します。ランダムステートメントも変更しました。これは疑似ランダムであり、真のランダムではないため、オプションが多いほど、30%の確率でヒットする可能性が高くなります。

空白のステートメントをエコーする場合は、関数を実行します。

if(mt_rand(1,100) <= 30)
{
    echo '';
    function();
}

正しいでしょう。繰り返しになりますが、ifステートメントを変更してより均等に分散させました。より均等な分配を保証するために、あなたはすることさえできます

if(mt_rand(1,10000) <= 3000)

ここでは真のランダム性を扱っていないので。アルゴリズムが他の数値よりも1つの数値を選択している可能性は十分にあります。この質問のコメントで述べたように、アルゴリズムはランダムであるため、同じ数を何度も何度も選択している可能性があります。ただし、実際には、選択する数が多いほど、分布が均等になる可能性があります。選択できる数値が3つしかない場合、結果が歪む可能性があります。

于 2012-08-05T20:17:25.313 に答える
1

randを使用しているため、30%の確率で呼び出されることを保証することはできません。代わりに、1/3の時間を効果的に与えるモジュラスを使用できる場合、これがあなたにとってどれほど重要かはわかりませんが...

$max = 27;

for($i = 1; $i < $max; $i++){
    if($i % 3 == 0){
        call_function_here();
    }
}
于 2012-08-05T20:25:11.453 に答える
0

モジュラスはfmodを使用できるフロートでは機能しないため、このコードはかなり近いはずであり、反復の合計とパーセントを置き換えることができます...

$total = 50;
$percent = 0.50;

$calls = $total * $percent;
$interval = $total / $calls;

$called = 0;
$notcalled = 0;

for($i = 0; $i <= $total; $i++){
    if(fmod($i, $interval) < 1){
        $called++;
        echo "Called" . "\n";
    }else{
        $notcalled++;
        echo "Not Called" . "\n";
    }
}

echo "Called:  " . $called . "\n";
echo "Not Called: " . $notcalled . "\n";
于 2012-08-05T22:38:11.527 に答える