PHP的shuffle功能有多随机?

Sin*_*nan 17 php random shuffle

有谁知道PHP shuffle()函数的随机性是什么?它取决于操作系统吗?它是否使用PHP自己的播种机?

可以mt_rand()用作发电机吗?

Cha*_*net 14

shuffle()函数基于相同的生成器rand(),即基于线性同余算法的系统生成器.这是一个快速生成器,但随机性或多或少.从PHP 4.2.0开始,随机生成器会自动播种,但如果需要,可以使用srand()函数播种.

mtrand()基于Mersenne Twister算法,这是可用的最佳伪随机算法之一.要使用该生成器对数组进行洗牌,您需要编写自己的shuffle函数.您可以查看Fisher-Yates算法的示例.编写自己的shuffle函数会产生更好的随机性,但会比内置的shuffle函数慢.


小智 5

基于Mirouf的回答(非常感谢你的贡献)......我对它进行了一些改进以取出多余的数组计数.我也根据自己的理解将变量命名为略有不同.

如果你想像shuffle()一样使用它,你可以修改参数传递的参数,即&$ array,然后确保你将返回更改为:"return;" 并将结果随机数组分配回$ array:$ array = $ randArr; (返回前).

function mt_shuffle($array) {
    $randArr = [];
    $arrLength = count($array);

    // while my array is not empty I select a random position
    while (count($array)) {
        //mt_rand returns a random number between two values
        $randPos = mt_rand(0, --$arrLength);
        $randArr[] = $array[$randPos];

        /* If number of remaining elements in the array is the same as the
         * random position, take out the item in that position,
         * else use the negative offset.
         * This will prevent array_splice removing the last item.
         */
        array_splice($array, $randPos, ($randPos == $arrLength ? 1 : $randPos - $arrLength));
    }

    return $randArr;
}
Run Code Online (Sandbox Code Playgroud)


Jon*_*Jon 5

PHP 7.1更新

由于rng_fixes rfc是为PHP 7.1实现的,因此shuffle现在的实现利用了Mersenne Twister PRNG(即,它使用mt_rand并受调用影响mt_srand)。

旧版系统PRNG(rand)不再可用;功能randsrand实际上是它们的mt_等效物的别名。