Распределенная последовательная генерация случайных чисел в Ruby 1.9.2 - PullRequest
5 голосов
/ 27 августа 2010

Класс Random в Ruby 1.9.2 гарантированно генерирует случайные числа в том же порядке, учитывая конкретное начальное число и диапазон. Например:

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

Но предположим, что я хочу сгенерировать следующее число в последовательности на другом компьютере (без повторного создания более ранних чисел в последовательности). Это должно быть возможно, учитывая предыдущий вывод. Есть ли способ сделать это с классом Random? Или я должен написать свою собственную реализацию Mersenne twister ?

[ Редактировать: Как указано в комментариях ниже, на самом деле невозможно определить состояние экземпляра Random только из вывода, потому что только часть состояния ( младшие 32 бита) используются для вывода.]

1 Ответ

2 голосов
/ 27 августа 2010

Невозможно проверить, но генератор можно маршалировать, согласно Марк-Андре Лафортуну здесь .Так что это может работать:

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)
...