代码之家  ›  专栏  ›  技术社区  ›  Joe

为什么兰德在只做(1,2)的时候看起来比马图兰德更随机?

  •  0
  • Joe  · 技术社区  · 7 年前

    我有一些元素,我试图以50%的概率随机输出。像这样写了一个快速的if语句。

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

    请注意,当使用mt_rand时,“再见”是连续多次输出的,而如果我只使用“rand”,则是更平均的分布。

    在处理这样一个简单的1-2随机化时,有没有什么关于mt_rand的事情会让情况变得更糟?或者是我的数据集太小,以至于这些结果只是轶事?

    1 回复  |  直到 7 年前
        1
  •  2
  •   trincot    7 年前

    随机生成序列的结果可能是“一行多次”获得相同的值。如果不允许出现这样的模式,它就不会是完全随机的。如果您继续采样,您还会发现,如果持续足够长的时间,有时会连续出现多次相反的值。

    测试生成的值是否确实非常随机且均匀分布的一种方法是,计算生成的相同值与之前生成的相同值的次数,以及生成的相反值的次数。

    请注意,字符串“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

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

    这意味着1和2的生成次数大致相等,并且 重复 一个值的变化和一个值的变化一样频繁 在这个系列中。

    显然,这些数字很少有人知道 同样,因为这意味着最后两个生成的值根本不是随机的,因为它们需要将这些计数设置为所需的值。

    重要的是你的 样品

    推荐文章