5

为了防止长时间运行的预渲染脚本中的内存损坏,我希望能够对我的程序说“好的,渲染前 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 位很容易以完美的精度存储数字,如果使用位运算符,整数会被截断或环绕。

4

2 回答 2

2

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

http://en.wikipedia.org/wiki/Random_number_generation#Computational_methods上的算法之类的东西甚至可以解决问题。每当您开始一个新序列时,您都可以使用当前时间为其播种。

于 2013-02-25T04:21:06.057 回答
1

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

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

于 2013-02-25T04:22:14.600 回答