長時間実行される事前レンダリングスクリプトでのメモリの破損を防ぐために、プログラムに「オーケー、最初の1,000ステップをレンダリングする」と伝えたいと思います。次に、出力を確認したり、調べたりすることができます。次に、「ステップ1,001〜10,000を生成します」と言います。
私はそれをほぼ完全に機能させています。私が苦労していることが1つだけあります。
レンダリングスクリプトはrand()
、生成された出力にエントロピーを追加するために使用しますsrand()
。最初は、再レンダリングでエントロピーが一定に保たれるようにします。rand()
現在、この問題は、呼び出された回数を数え、実際の生成を開始する前に何度も呼び出すことで「解決」しています。これに伴う問題は、特に数百万の乱数を生成した場合、非常に遅くなる可能性があることです。
srand()
シーケンスの生成を続行するために渡す必要のある値を決定する方法はありますか?これも可能ですか?
そうでない場合、どの正確なアルゴリズムrand()
が使用されているかを知る方法はありますか?私は自分が取得しているマップが本当に好きsrand(43)
で、可能であればそれを保持したいと思います!
編集:パタシュの答えを使用して、これが私が思いついたものです:
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ビットは、数値を完全な精度で格納するのに十分簡単であり、ビット演算子を使用すると整数が切り捨てられるかラップアラウンドされるため、floatの使用に依存しています。