La classe Random
in Ruby 1.9.2 è garantita per generare numeri casuali nello stesso ordine, dati un particolare seme e intervallo. Per esempio:Generazione sequenziale di numeri casuali distribuiti in Ruby 1.9.2
r = Random.new(23)
r.rand(100) # 83
r.rand(100) # 40
Ma supponiamo che io voglio per generare il numero successivo nella sequenza su un altro computer (senza ri-generare i numeri precedenti nella sequenza). Questo dovrebbe essere possibile, dato l'output precedente. C'è un modo per farlo con la classe Random
? O devo scrivere la mia implementazione dello Mersenne twister?
[Edit: Come sottolineato nei commenti qui sotto, non è infatti possibile determinare lo stato di un'istanza Random
appena dall'uscita, perché solo parte dello stato (in particolare, i bassi 32 bit) vengono utilizzati per l'output.]
Perché dovrebbe essere possibile farlo? – adamse
@adamse Il numero successivo viene generato deterministicamente in base allo stato interno in 'r'. Quindi se crei un nuovo 'r' con lo stesso stato di quello vecchio, genererà il numero successivo nella sequenza. Ha senso? Sulla base della mia comprensione degli algoritmi alla base di 'Random', credo che questo stato possa essere rappresentato dal seme e dall'ultimo numero generato. –
leggendo l'implementazione [backported] (http://github.com/marcandre/backports/blob/master/lib/backports/1.9.2/random/MT19937.rb) sembra che in effetti tu possa trovare lo stato successivo usando il l'ultimo e il seme. Tuttavia, per quanto ho capito, potresti non essere in grado di trovare lo stato dato il numero generato. – adamse