保存/恢复PHP的状态';s兰德()

保存/恢复PHP的状态';s兰德(),php,random,Php,Random,为了防止长时间运行的预渲染脚本中的内存损坏,我希望能够对我的程序说“好的,渲染前1000个步骤”。然后我可以查看输出,检查它,等等。然后我想说“现在生成步骤1001到10000” 我让它工作得几乎完美。只有一件事我在挣扎 渲染脚本使用rand()将熵添加到生成的输出中,并在开始时使用srand()确保其在重新渲染时保持不变。目前,我通过计算调用rand()的次数来“解决”这个问题,然后在开始实际生成之前调用它多少次。问题是它可能非常慢,特别是当我生成了几百万个随机数时 有没有办法确定我需要传递给

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

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

渲染脚本使用
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);
}
它依赖于浮点数的使用,因为据我所知,尾数的51位很容易以完美的精度存储数字,如果使用位运算符,整数会被截断或环绕。

这并不能直接回答你的问题,但因为看起来你不需要特别“好”的随机数,为什么不考虑编写自己的伪随机数生成器呢?通过这种方式,您可以在需要时轻松地序列化和反序列化其状态

类似于at的算法甚至可能会起到作用。每当你开始一个新的序列时,你都可以用当前时间为它设定种子。

这个页面解释了PHP的rand()的源代码


请注意,它不是很漂亮,它取决于PHP的特性和您的操作系统对rand()的实现:)

rand的实际实现取决于底层操作系统。这可能是事实。这可能是我最好的选择。我会失去我喜欢的地图,但我肯定会找到另一张。毕竟,只有40亿个种子可供选择:pSo如果我理解正确,我可以使用这样的东西吗<代码>函数rnd(){static$seed=42;$seed=($seed*0x43fd43fd+0xc39ec3)>>4)&0xffffff;返回$seed%2;}获取随机布尔值?@Kolink当然,我觉得不错。它可能不是很“随机”,但它不应该比PHP更糟糕,并且应该满足您的需要。你也可以尝试一下,看看你得到了什么样的发行版。如果您想要更好的东西,您可以尝试实现非常有用的链接,因为看起来我可以重现这里使用的实际RNG。编辑我的问题以显示我正在使用的代码,您觉得它正确吗?链接似乎已失效。