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)
由于rng_fixes rfc是为PHP 7.1实现的,因此shuffle现在的实现利用了Mersenne Twister PRNG(即,它使用mt_rand并受调用影响mt_srand)。
旧版系统PRNG(rand)不再可用;功能rand,srand实际上是它们的mt_等效物的别名。