私の質問はこれとは正反対です。
これは私のテストファイルからの抜粋です
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_sampler1
とtest_sampler2
は、確率的サンプリングを実行するクラスの 2 つのオブジェクトです。クラスには、random_inst
タイプ のオブジェクトである属性がありますrandom.Random()
。このファイルには、 のシードが与えられたときにによって返された の の状態がseed1234
含まれており、何が何であるかを推測できます。私がしたことは、ターミナルで を作成し、 のランダムシードを与え、 で状態を取得してファイルに保存することでした。次に、回帰テストを再作成すると、常に同じ出力が得られます。TestSampler
random_inst
random.getstate()
1234
seed7883
TestSampler
1234
rand_inst.getstate()
でも
上記と同じ手順は機能しませんtest_sampler2
-同じランダムな数字のシーケンスが得られないものは何でも。私はpythonのrandom
モジュールを使用しており、他の場所にはインポートしていませんがnumpy
、一部の場所では使用しています(しかしnumpy.random
.
との唯一の違いはtest_sampler1
、test_sampler2
2 つの異なるファイルから作成されることです。私はこれが大したことであり、私が書いたコードに完全に依存していることを知っていますが、ここに約800行のコードを単純に貼り付けることもできません。
test_sampler2
の乱数発生器の状態を混乱させているのは何ですか?
解決
私のコードには2つの別々の問題がありました:
1
私のスクリプトはコマンド ライン スクリプトであり、Python のoptparse
ライブラリを使用するようにリファクタリングした後、次のようなものを使用してサンプラーのシードを設定していることがわかりました。これは、シードをではなくseed = sys.argv[1]
に設定していたことを意味します。オブジェクトと私はそれが難しい方法であることがわかりました。これは、同じシードを使用した場合に 2 つの異なるシーケンスが得られる理由を説明しています。str
int
seed
python sample 1234 #seed is 1234
unit_tests.py
test_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 は確定的に動作し始めました。