如何在不使用PHP生成生成器的情况下获得可预测的伪随机数字序列?

时间:2011-06-25 16:35:01

标签: php random

我的主机服务器上禁用了

srand()mt_srand()。我想从数组中选择一些随机项,但在特定日期应该是相同的。使用日期播种可以在我的计算机上进行,但不能在主机服务器上进行。 (该死的这些禁用 - 快乐安全偏执的人!)

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

编辑:完成。我在相关问题中找到this simple version并修改了PHP的代码。完美!

2 个答案:

答案 0 :(得分:1)

如果它确实是您需要的基本随机性,您可以使用类似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
}

答案 1 :(得分:0)

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

编辑:该网站非常可靠,但偶尔也有停机时间,因此我建议存储几天的随机数。

Edit2,经过一些澄清:

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

相关问题