我有一个 PHP 脚本,它需要随机化一个具有一致结果的数组,因此它可以将前几个项目呈现给用户,然后如果他们愿意,他们可以从同一个洗牌集中提取更多结果。
我目前使用的是这个(基于我相信的 Fisher Yates 算法):
function shuffle(&$array, $seed)
{
mt_srand($seed);
for ($a=count($array)-1; $a>0; $a--) {
$b = mt_rand(0, $a);
$temp = $array[$a];
$array[$a] = $array[$b];
$array[$b] = $temp;
}
}
这在我的本地安装上运行良好,但它需要运行的服务器安装了 Suhosin,它覆盖了 mt_srand,这意味着种子被忽略,数组只是随机打乱,用户得到重复的结果。
我在 Google 上找到的所有内容都表明我需要禁用 suhosin.mt_srand.ignore(和 suhosin.srand.ignore,但不确定后者是否相关)所以我将以下内容放入 .htaccess 中:
php_flag suhosin.mt_srand.ignore Off
php_flag suhosin.srand.ignore Off
我无法访问此服务器上的 php.ini,所以 AFAIK 这是我能做到的唯一方法。问题是没有效果 - phpinfo() 仍然将两个设置都显示为 On,而我可以使用 .htaccess 更改其他 Suhosin 设置没有问题。
所以我想我正在寻找的是一种实际禁用 suhosin.mt_srand.ignore 的方法(或者它不起作用的原因),或者是一种从 PHP 中播种随机数生成器的解决方法。还是我只需要自己实现另一个 RNG?
任何帮助将非常感激。谢谢!