保存/恢复 PHP 的 rand() 状态

Nie*_*sol 5 php random

为了防止长时间运行的预渲染脚本中的内存损坏,我希望能够对我的程序说“好的,渲染前 1,000 步”。然后我可以查看输出,检查它等。然后我想说“现在生成步骤 1,001 到 10,000”。

我让它几乎完美地工作。我只有一件事在挣扎。

渲染脚本用于rand()向生成的输出添加熵,并srand()在开始时确保它在重新渲染时保持不变。目前我通过计算rand()被调用的次数来“解决”这个问题,然后在开始实际生成之前调用它很多次。问题在于它可能非常慢,尤其是当我生成了几百万个随机数时。

有什么方法可以确定我需要传递给什么值srand()才能继续生成序列?这甚至可能吗?

如果没有,有没有办法找出rand()正在使用的确切算法?我真的很喜欢我从中获得的地图,srand(43)并希望尽可能保留它!


编辑:使用帕塔舒的回答,这是我想出的:

function rnd() {
    static $seed = 42;
    $seed = $seed*214013+2531011;
    $mod = pow(2,32);
    while($seed > $mod) $seed -= $mod;
    $rs = floor($seed/65536)&0x7fff;
    return floor(2*$rs/0x8000);
}
Run Code Online (Sandbox Code Playgroud)

它依赖于浮点数的使用,因为据我所知,尾数的 51 位很容易以完美的精度存储数字,如果使用位运算符,整数会被截断或环绕。

Pat*_*shu 1

此页面http://cod.izes.com/2008/05/php-rand01-on-windows-openssl-rand-on.html解释了PHP rand()的源代码

请注意,它不是很漂亮,它依赖于 PHP 的怪癖和你的操作系统对 rand() 的实现:)