我正在尝试基于固定字符串创建“随机”字符串。如果可能的话,我希望能够创建相同的随机字符串(我知道它是矛盾的),前提是我使用相同的种子。像这样:
$base = '0123456789abcdef'; $seed = 'qwe123'; function get_seeded_random_string($base, $seed){ ??? }
预期的行为是,只要我提供相同的$base
和$seed
,我总是得到相同的随机字符串。
答案 0 :(得分:11)
很抱歉,但相应于the documentation,随机播放功能会自动播种。
通常情况下,您不应该尝试使用自己的算法来随机化事物,因为它们很可能存在偏差。已知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;
}
}
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;
}
}
答案 1 :(得分:2)
是的,使用mt_srand
,您可以为“更好”的随机数生成器mt_rand
指定种子。