10

組み込みの疑似乱数ジェネレーターの現在の状態を Perl に保存して、プログラムを再度実行したときに、新しいシーケンスから開始するのではなく、中断したところからシーケンスを取得できるようにする方法はありますか?

現在、私は最初のシードと同様に現在の場所を保存してから、次のようなものを使用して既に見た最初のセグメントを破棄しています。

sub consume_upto_n {
    my ($seed, $n) = @_;
    $n = 1 unless defined $n and $n >= 1;
    srand $seed;
    rand for 1 .. $n - 1;
    return;
}

例えば:

srand 0x18;
my @v = map { rand } 1 .. 5;

後で:

consume_upto_n(0x18, 3);
my @z = map { rand } 3 .. 5;

次に、$z[0] == $v[2]など$z[1] == $v[3]

4

2 に答える 2

1

perl 5.13.4以降、シードをsrand返します:

srand()シードを返すようになりました

これにより、繰り返し可能な結果を​​必要とするプログラムは、独自のシード生成メカニズムを考え出す必要がなくなります。代わりに、srand()将来の使用のためにリターンを使用し、何らかの形で隠しておくことができます。典型的なものは、実行ごとに利用可能な時間内に包括的にテストするにはあまりにも多くの組み合わせを持つテスト プログラムです。毎回ランダムなサブセットをテストでき、失敗した場合は、その実行に使用されたシードをログに記録して、後で正確な結果を再現するために使用できるようにします。

于 2010-10-04T14:20:08.223 に答える