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)

因为我们在这里没有处理真正的随机性。该算法完全有可能选择一个数字而不是其他数字。正如这个问题的评论中提到的,由于算法是随机的,它可能会一遍又一遍地选择相同的数字。然而,在实践中,有更多的数字可供选择将很可能导致均匀分布。只有 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 回答