5

長時間実行される事前レンダリングスクリプトでのメモリの破損を防ぐために、プログラムに「オーケー、最初の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の使用に依存しています。

4

2 に答える 2

2

これはあなたの質問に直接答えるものではありませんが、特に「良い」乱数は必要ないように見えるので、独自の疑似乱数ジェネレーターを作成することを検討してみませんか?このようにして、必要なときにいつでもその状態を簡単にシリアル化および逆シリアル化できます。

http://en.wikipedia.org/wiki/Random_number_generation#Computational_methodsのアルゴリズムのようなものでもうまくいくかもしれません。新しいシーケンスを開始するときはいつでも、現在の時刻をシードできます。

于 2013-02-25T04:21:06.057 に答える
1

このページhttp://cod.izes.com/2008/05/php-rand01-on-windows-openssl-rand-on.htmlは、PHPのrand()のソースコードについて説明しています。

注意してください、それはあまりきれいではなく、PHPの癖とrand()のOS実装に依存しています:)

于 2013-02-25T04:22:14.600 に答える