为了防止长时间运行的预渲染脚本中的内存损坏,我希望能够对我的程序说“好的,渲染前 1,000 步”。然后我可以查看输出、检查它等。然后我想说“现在生成步骤 1,001 到 10,000”。
我让它几乎完美地工作。只有一件事让我苦恼。
渲染脚本使用 rand()
将熵添加到生成的输出中,以 srand()
开头以确保它在重新渲染时保持不变。目前,我通过计算 rand()
被调用的次数来“解决”这个问题,然后在开始实际生成之前调用它多次。这样做的问题是它可能会非常慢,尤其是当我生成了几百万个随机数时。
有什么方法可以确定我需要将什么值传递给 srand()
以继续生成序列?这可能吗?
如果不是,是否有任何方法可以找出 rand()
使用的确切算法?我非常喜欢从 srand(43)
获取的 map ,如果可能的话我想保留它!
编辑:使用 Patashu 的回答,这是我想出的:
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);
}
它依赖于 float 的使用,因为据我所知,尾数的 51 位很容易以完美的精度存储数字,如果使用位运算符,整数会被截断或环绕。
最佳答案
这不会直接回答您的问题,但由于看起来您不需要特别“好的”随机数,为什么不考虑编写您自己的伪随机数生成器呢?这样您就可以在需要时轻松地序列化和反序列化其状态。
类似于 http://en.wikipedia.org/wiki/Random_number_generation#Computational_methods 的算法甚至可以解决问题。每当您开始一个新序列时,您都可以用当前时间作为种子。
关于php - 保存/恢复 PHP 的 rand() 的状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15059979/