爲了防止長時間運行的預渲染腳本中的內存損壞,我希望能夠對我的程序說「好吧,呈現前1000步」。然後我可以看看輸出,檢查它等。然後我想說「現在生成步驟1,001到10,000」。保存/恢復PHP的rand狀態()
我的工作幾乎完美。只有一件事我正在努力。
渲染腳本使用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位足夠容易以完美的精度存儲數字,如果使用位操作符,則整數會被截斷或環繞。
實際'rand'的實現取決於底層操作系統。這個事實可以有[令人驚訝的效果](http://cod.ifies.com/2008/05/php-rand01-on-windows-openssl-rand-on.html)。 – Gumbo 2013-02-25 04:22:23