Ruby 1.9.2の分散系列乱数生成
-
01-10-2019 - |
質問
Random
Ruby 1.9.2のクラスは、特定の種子と範囲を考慮して、同じ順序で乱数を生成することが保証されています。例えば:
r = Random.new(23)
r.rand(100) # 83
r.rand(100) # 40
ただし、別のコンピューターのシーケンスで次の数値を生成したいとします(シーケンスの以前の数値を再生成せずに)。これは、以前の出力を考慮して、可能である必要があります。でこれを行う方法はありますか Random
クラス?または、自分の実装を書く必要がありますか Mersenne Twister?
[編集: 以下のコメントで指摘されているように、の状態を決定することは実際には不可能です Random
状態の一部(具体的には32ビットが低い)の一部のみが出力に使用されるため、出力からのみインスタンスがあります。
解決
Marc-AndréLafortuneによると、テストすることはできませんが、ジェネレーターをマーシャル化することができます ここ。だからこれはうまくいくかもしれない:
r = Random.new(23)
r.rand(100) # 83
r.rand(100) # 40
File.open("/path/to/file","w") do |f|
Marshal.dump(r,f)
end
# later, may be on another computer
File.open("/path/to/file","r") do |f|
@v = Marshal.load(f)
end
puts @v.rand(100)
所属していません StackOverflow