为了防止长时间运行的预渲染脚本中的内存损坏,我希望能够对我的程序说“好的,渲染前 1000 步”。然后我可以查看输出,检查它等等。然后我想说“现在生成步骤 1,001 到 10,000”。
我让它工作得几乎完美。我只有一件事在挣扎。
渲染脚本用于rand()
将熵添加到生成的输出中,并srand()
在开始时确保它在重新渲染中保持不变。目前我通过计算rand()
被调用的次数来“解决”这个问题,然后在开始实际生成之前调用它多次。这样做的问题是它可能非常慢,尤其是当我生成了几百万个随机数时。
有什么方法可以确定我需要传递什么值srand()
才能继续生成序列?这甚至可能吗?
如果没有,有什么方法可以找出rand()
正在使用的确切算法?我真的很喜欢我从中得到的地图srand(43)
,如果可能的话,我想保留它!
编辑:使用 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);
}
它依赖于浮点数的使用,因为据我所知,尾数的 51 位很容易以完美的精度存储数字,如果使用位运算符,整数会被截断或环绕。