5

Ruby 1.9.2のRandomクラスは、特定のシードと範囲が与えられると、同じ順序で乱数を生成することが保証されています。例えば:

r = Random.new(23)
r.rand(100)         # 83
r.rand(100)         # 40

しかし、シーケンス内の次の番号を別のコンピューターで生成したいとします (シーケンス内の以前の番号を再生成する必要はありません)。前の出力を考えると、これは可能であるはずです。Randomクラスでこれを行う方法はありますか?それとも、 Mersenne twisterの独自の実装を作成する必要がありますか?

[編集:以下のコメントで指摘されているように、状態のRandom一部 (具体的には下位 32 ビット) のみが出力に使用されるため、実際には出力だけからインスタンスの状態を判断することはできません。]

4

1 に答える 1

2

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)
于 2010-08-27T19:23:54.820 に答える