Класс Random
в Ruby 1.9.2 гарантированно генерирует случайные числа в том же порядке, что и для конкретного семени и диапазона. Например:Генерация распределенных последовательных случайных чисел в Ruby 1.9.2
r = Random.new(23)
r.rand(100) # 83
r.rand(100) # 40
Но предположим, что я хочу, чтобы генерировать следующий номер в последовательности на другом компьютере (без повторной генерации ранее чисел в последовательности). Это должно быть возможным, учитывая предыдущий результат. Есть ли способ сделать это с классом Random
? Или мне нужно написать собственную реализацию Mersenne twister?
[Редактировать: Как указано в комментариях ниже, это на самом деле не возможно определить состояние Random
экземпляра только с выхода, потому что только часть состояния (в частности, низкий 32 бит) используются для выхода.]
Почему это возможно? – adamse
@adamse Следующее число генерируется детерминированным образом с учетом некоторого внутреннего состояния в 'r'. Поэтому, если вы создадите новый 'r' с тем же состоянием, что и старый, он будет генерировать следующее число в последовательности. Имеет смысл? Основываясь на моем понимании алгоритмов, лежащих в основе «Случайного», я считаю, что это состояние может быть представлено семенем и последним сгенерированным числом. –
, прочитав реализацию [backported] (http://github.com/marcandre/backports/blob/master/lib/backports/1.9.2/random/MT19937.rb), кажется, что вы можете найти следующее состояние, используя последний и семя. Однако, насколько я понимаю, вы, возможно, не сможете найти состояние, заданное сгенерированным числом. – adamse