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

标签 php random

为了防止长时间运行的预渲染脚本中的内存损坏,我希望能够对我的程序说“好的,渲染前 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/

相关文章:

C++随机固定字符串集

php - 如何将 php 变量传递给 ajax

php - 是否需要关闭 cURL 连接?

javascript - 使用 html2canvas 的屏幕截图需要在文件夹中另存为 psd

random - boost::具有固定种子和可变精度的多精度随机数

c++ - 使用 std::uniform_int_distribution 并稍后定义其范围

ruby - 在 Ruby 上以随机延迟执行代码

python - 我是在随机生成器中偶然发现了某种模式,还是得到了极其罕见的东西?

php - 按周排列数组

php - php中如何传递值