可重现的随机数系列

时间:2011-11-09 17:53:20

标签: php random

如何在PHP中获得一系列可重现的伪随机数?

在旧版本的PHP中,我可以通过在RNG中使用相同的种子来实现,但它不再起作用,因为PHP已经改变了rand和mt_rand的工作方式。

请在PHP.net页面中看到此评论:

  

请记住默认情况下安装的Suhosin补丁   许多PHP安装,如Debian和DirectAdmin完全禁用   srand和mt_srand函数用于加密安全性原因。至   从a上的固定种子生成可重现的随机数   Suhosin强化的服务器,您需要包含自己的伪随机数   发电机代码。

该评论的链接:http://www.php.net/manual/en/function.srand.php#102636

有没有准备好的解决方案?我没有时间和经验来创建我自己的伪随机生成器代码。

我的目标是拥有一个代码

<?php
   //( pseudo random code here...)
   $the_seed = 123; // 123 is just a number for demo purposes, NOT a static number
                    //...i hope you get the idea. It's just a hardcoded seed,
                    // it could be a seed based on a user-id, a date etc...
                    // we need the same output for a given seed.
   //( pseudo random code here...)

   // ...and finally
   echo $the_random_number;
 ?>

因此,每当我访问此页面时,我都会得到相同的号码。

4 个答案:

答案 0 :(得分:10)

Mersenne Twist是一个很好的快速PRNG,这是一个公共域PHP实现:

http://kingfisher.nfshost.com/sw/twister/

仅适用于PHP 5.3.0及更高版本。

答案 1 :(得分:7)

一些指标中最好的随机数算法之一是Mersenne Twister。 您可以找到纯PHP版本here(还有其他版本)。

然后你可以打电话:

init_with_integer($integer_seed)

每次都获得相同的输出(对于给定的种子)。

答案 2 :(得分:1)

如果您不需要高质量的输出,Lehmer RNG 就非常简单。这是 srand() 可以在内部使用的算法之一(取决于您的操作系统)。

$seed = 42; // any integer, maybe a database id

// init Lehmer RNG
$seed = $seed % 2147483647;
if ($seed <= 0) $seed += 2147483646;

// generate as many random numbers as you need
$seed = $seed * 48271 % 2147483647;
print($seed);

$seed = $seed * 48271 % 2147483647;
print($seed);

$seed = $seed * 48271 % 2147483647;
print($seed);

$seed = $seed * 48271 % 2147483647;
print($seed);
...

您可以使用以下命令将输出限制在一个范围内:

$min = 0;
$max = 9;
print($min + ($seed % $max));

答案 3 :(得分:-1)

这不是最好的,但它是一个工作

function ranseed($min, $max, $seed) {
    return round($min + (hexdec(md5($seed)) / hexdec("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF")) * ($max - $min));
}