0

私の質問はこれとは正反対です。

これは私のテストファイルからの抜粋です

f1 = open('seed1234','r')
f2 = open('seed7883','r')
s1 = eval(f1.read())
s2 = eval(f2.read())
f1.close()
f2.close()
####
test_sampler1.random_inst.setstate(s1)
out1 = test_sampler1.run()
self.assertEqual(out1,self.out1_regress) # this is fine and passes

test_sampler2.random_inst.setstate(s2)
out2 = test_sampler2.run()
self.assertEqual(out2,self.out2_regress) # this FAILS

いくつかの情報 -

test_sampler1test_sampler2は、確率的サンプリングを実行するクラスの 2 つのオブジェクトです。クラスには、random_instタイプ のオブジェクトである属性がありますrandom.Random()。このファイルには、 のシードが与えられたときにによって返された の の状態がseed1234含まれており、何が何であるかを推測できます。私がしたことは、ターミナルで を作成し、 のランダムシードを与え、 で状態を取得してファイルに保存することでした。次に、回帰テストを再作成すると、常に同じ出力が得られます。TestSamplerrandom_instrandom.getstate()1234seed7883TestSampler1234rand_inst.getstate()

でも

上記と同じ手順は機能しませんtest_sampler2-同じランダムな数字のシーケンスが得られないものは何でも。私はpythonのrandomモジュールを使用しており、他の場所にはインポートしていませんがnumpy、一部の場所では使用しています(しかしnumpy.random.

との唯一の違いはtest_sampler1test_sampler22 つの異なるファイルから作成されることです。私はこれが大したことであり、私が書いたコードに完全に依存していることを知っていますが、ここに約800行のコードを単純に貼り付けることもできません。

test_sampler2の乱数発生器の状態を混乱させているのは何ですか?

解決

私のコードには2つの別々の問題がありました:

1

私のスクリプトはコマンド ライン スクリプトであり、Python のoptparseライブラリを使用するようにリファクタリングした後、次のようなものを使用してサンプラーのシードを設定していることがわかりました。これは、シードをではなくseed = sys.argv[1]に設定していたことを意味します。オブジェクトと私はそれが難しい方法であることがわかりました。これは、同じシードを使用した場合に 2 つの異なるシーケンスが得られる理由を説明しています。strintseedpython sample 1234 #seed is 1234unit_tests.pytest_sampler1 = TestSampler(seed=1234)

2

hereから借りた離散分布サンプリングの関数があります(受け入れられた回答を見てください)。コードには基本的なものが欠けていました: 同じ値と確率の配列を与えても、順列 (たとえば、値と確率と値と確率) によって変換され['a','b'][0.1,0.9]シード['b','a'][0.9,0.1]設定され、たとえば0.3、PRNG によって同じランダム サンプルが得られますが、確率の間隔が異なるため、1 つのケースでは abと 1 つの anが得られますa。それを修正するために、値と確率を一緒に圧縮し、確率とtadaaでソートしました-今では常に同じ確率間隔が得られます。

両方の問題を修正した後、コードは期待どおりに機能しました。つまり、out2 は確定的に動作し始めました。

4

1 に答える 1