加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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

发布时间:2020-12-13 16:49:55 所属栏目:PHP教程 来源:网络整理
导读:为了防止长时间运行的预渲染脚本中的内存损坏,我希望能够对我的程序说“好吧,渲染前1000个步骤”.然后我可以看一下输出,检查它等等.然后我想说“现在生成步骤1,001到10,000”. 我的工作几乎完美.只有一件事我在苦苦挣扎. 渲染脚本使用rand()将熵添加到生成的
为了防止长时间运行的预渲染脚本中的内存损坏,我希望能够对我的程序说“好吧,渲染前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位很容易以完美的精度存储数字,如果使用位运算符,则整数会被截断或环绕.

解决方法

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读