保存/恢复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()的操作系统实现:) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |