如何通过提供种子并获得相同的顺序在PHP中随机化数组?

Ang*_*eno 8 php arrays random math shuffle

我试图创建一个基于固定字符串的"随机"字符串.如果可能的话,我希望能够创建相同的随机字符串(我知道它是矛盾的),前提是我使用相同的种子.像这样:

    $base = '0123456789abcdef';
    $seed = 'qwe123';

    function get_seeded_random_string($base, $seed){
        ???
    }

预期的行为将是,只要我给出相同的$base,$seed我总是得到相同的随机字符串.

And*_*zlo 12

抱歉,相应的文档中,随机播放功能会自动播种.

通常情况下,您不应该尝试使用自己的算法来随机化事物,因为它们很可能是有偏见的.已知Fisher-Yates算法既高效又无偏见:

function fisherYatesShuffle(&$items, $seed)
{
    @mt_srand($seed);
    $items = array_values($items);
    for ($i = count($items) - 1; $i > 0; $i--)
    {
        $j = @mt_rand(0, $i);
        $tmp = $items[$i];
        $items[$i] = $items[$j];
        $items[$j] = $tmp;
    }
}
Run Code Online (Sandbox Code Playgroud)

php7中字符串的相同功能

function fisherYatesShuffle(string &$items, int $seed)
{
    @mt_srand($seed);
    for ($i = strlen($items) - 1; $i > 0; $i--)
    {
        $j = @mt_rand(0, $i);
        $tmp = $items[$i];
        $items[$i] = $items[$j];
        $items[$j] = $tmp;
    }
}
Run Code Online (Sandbox Code Playgroud)