为什么仅做(1,2)时rand看起来比mt_rand随机?

时间:2018-12-08 09:28:54

标签: php if-statement random

我尝试以50%的输出机会随机化一些元素。这样写一个快速的if语句。

$rand = mt_rand(1, 2);

if ( $rand == 1 ) {
echo "hello";
} else {
echo "goodbye";
}

请注意,使用mt_rand时,“ goodbye”连续输出多次,但是,如果我只使用“ rand”,则分配更为均匀。

关于mt_rand,是否有这样的东西使处理这样的简单1-2随机化变得更糟?还是我的数据集如此之小,以至于这些结果只是轶事?

1 个答案:

答案 0 :(得分:2)

要获得“连续多次”相同的值,可能是随机生成的序列的结果。如果不允许这种模式发生,那将不是完全随机的。如果继续取样,只要保持足够长的时间,相反的值有时会连续出现几次。

测试生成的值确实是相当随机且均匀分布的一种方法是计算与以前生成的值相同的值生成了多少次,以及生成了相反的值多少次。

请注意,字符串“ hello”和“再见”并没有添加太多有用的信息;我们只看值1和2。

您可以通过以下方式进行这种测试:

// $countAfter[$i][$j] will contain the number of occurrences of 
//    a pair $i, $j in the randomly generated sequence.
// So there is an entry for [1][1], [1][2], [2][1] and [2][2]:
$countAfter = [1 => [1 => 0, 2 => 0], 
               2 => [1 => 0, 2 => 0]];
$prev = 1; // We assume for simplicity that the "previously" generated value was 1              
for ($i = 0; $i < 10000; $i++) { // Produce a large enough sample
    $n = mt_rand(1, 2);
    $countAfter[$prev][$n]++; // Increase the counter that corresponds to the generated pair
    $prev = $n;
}
print_r($countAfter);

您可以在此demo中看到,输出的4个数字相差不大。输出类似于:

Array (
    [1] => Array (
        [1] => 2464
        [2] => 2558
    )
    [2] => Array (
        [1] => 2558
        [2] => 2420
    )
)

这意味着生成1和2的次数相等,并且值的重复与该系列中的 toggle 一样频繁。< / p>

显然,这些数字很少完全相同,因为这将意味着最后一对生成的值根本不会是随机的,因为它们需要将这些计数提高到所需值。

重要的是,您的样本必须足够大才能看到已确认的均匀分布模式。