PHP的随机播放功能随机性如何?

| 有谁知道PHP的
shuffle()
函数的随机性是什么?是否取决于操作系统? 它使用PHP自己的播种器吗? 可以将ѭ1用作发生器吗?     
已邀请:
shuffle()
函数基于与ѭ3on相同的生成器,后者是基于线性同余算法的系统生成器。这是一个快速生成器,但是具有或多或少的随机性。从PHP 4.2.0开始,将自动为随机数生成器生成种子,但是您可以根据需要使用
srand()
函数对其进行种子设置。
mtrand()
基于Mersenne Twister算法,它是目前可用的最佳伪随机算法之一。要使用该生成器随机播放数组,您需要编写自己的随机播放函数。您可以查看例如Fisher-Yates算法。编写自己的随机播放功能会产生更好的随机性,但会比内置随机播放功能慢。     
基于Mirouf的回答(非常感谢您的贡献)...我对其进行了细化,以消除多余的数组计数。根据我自己的理解,我对变量的命名也有所不同。 如果要像shuffle()一样使用它,则可以修改参数以通过引用传递,即&$ array,然后确保将return更改为简单:\“ 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;
}
    
PHP 7.1更新 由于rng_fixes rfc是为PHP 7.1实现的,因此
shuffle
的实现现在利用了Mersenne Twister PRNG(即,它使用
mt_rand
并受到了
mt_srand
的影响)。 旧系统PRNG(
rand
)不再可用;函数
rand
srand
实际上是别名
mt_
。     
就像
rand()
一样随机。 作为PHP风格,您无需播种     
mt_rand()
生成一个随机数。
shuffle()
随机化数组。它还会在数组中生成新键,而不仅仅是重新排列旧键。 如果您想在PHP中播种,可以使用
mt_strand()
。 但是,由于PHP 4.2.0在调用mt_rand时会自动在PHP中完成种子设置。     
适用于关联数组和数字数组:
function mt_shuffle_array($array) {
    $shuffled_array = [];
    $arr_length = count($array);

    if($arr_length < 2) {
        return $array;
    }

    while($arr_length) {
        --$arr_length;
        $rand_key = array_keys($array)[mt_rand(0, $arr_length)];

        $shuffled_array[$rand_key] = $array[$rand_key];
        unset($array[$rand_key]);
    }

    return $shuffled_array;
}

$array = [-2, -1, \'a\' => \'1\', \'b\' => \'2\', \'c\' => \'3\', 11, \'d\' => \'4\', 22];
$shuffled_array = mt_shuffle_array($array);
    
我创建了一个对数组进行随机排序的函数。
/**
 * Build a random array
 *
 * @param mixed $array
 *
 * @return array
 */
function random_array($array) {
    $random_array = array();
    // array start by index 0
    $countArray = count($array) - 1;

    // while my array is not empty I build a random value
    while (count($array) != 0) {
        //mt_rand return a random number between two value 
        $randomValue = mt_rand(0, $countArray);
        $random_array[] = $array[$randomValue];

        // If my count of my tab is 4 and mt_rand give me the last element, 
        // array_splice will not unset the last item
        if(($randomValue + 1) == count($array)) {
            array_splice($array, $randomValue, ($randomValue - $countArray + 1));
        } else {
            array_splice($array, $randomValue, ($randomValue - $countArray));
        }

        $countArray--;
    }

    return $random_array;
}
这不是最好的方法,但是当我使用shuffle函数时,它总是以相同的顺序返回随机数组。如果这可以帮助某人,我会很高兴!     

要回复问题请先登录注册