如何在不使用PHP对生成器进行种子设定的情况下获得可预测的伪随机数字序列


How can you get a predictable pseudorandom sequence of numbers WITHOUT seeding the generator in PHP?

srand()mt_srand()在我的主机服务器上被禁用。我想从数组中随机选择几个项目,但在特定的一天应该是相同的。用日期播种在我的计算机上有效,但在主机服务器上无效。(该死的这些禁用快乐的安全偏执狂!)

一个外部发电机会很好,但我似乎找不到。我不是在做密码学,最基本的随机性会做

编辑:完成。我在一个相关的问题中找到了这个简单的版本,并将代码改编为PHP。完美的

如果这确实是你需要的基本随机性,你可以使用MD5之类的东西从一个可预测的字符串(例如:有问题的日期)中生成哈希。

获取前8个字符,转换为十进制,除以可能的最大值(16 ^ 8 - 1 = 4294967295),然后得到一个介于0和1之间的伪随机值。

$seed = date('ymd', $theDate);
$hash = md5($seed); // eg: a9993e364706816aba3e25717850c26c
$num = hexdec(substr($hash, 0, 4)) / 4294967295; // 2845392438 / 4294967295 = 0.662494
$myRandomItem = $myArray[floor($num * count($myArray))];

如果你需要选择多个项目,你可以简单地转到接下来的8个字符,或者在种子中添加一个可预测的递增值:

for ($i = 0; $i < $numOfThingsINeed; ++$i) {
    $seed = date('ymd', $theDate) . $i;
    // etc
}

网站www.random.org有一个很好的(对于某些用途,是免费的)随机生成器。为了增加味道,它甚至是"真正的随机",来自大气噪音。我知道你需要一整天都保持选择的一致性,但你可以通过从网站上保存一组数字并全天使用它们来轻松解决这个问题。。。当然,如果你的系统允许的话。这个解决方案取决于很多因素(你的列表有多大),但如果你每天下载一个新的随机数序列,你就不会有外部网站的带宽问题。

编辑:这个网站非常可靠,但偶尔会有停机时间,所以我建议存储几天的随机数字。

第2版,经过澄清:

如果一个简单的方法就足够了,为什么不编写自己的伪随机生成器呢?如果密码学不重要,您可以使用任何简单的算法,如以下算法:http://en.wikipedia.org/wiki/Mersenne_twister,文章中甚至给出了一个伪代码实现。