La clase Random
en Ruby 1.9.2 garantiza la generación de números aleatorios en el mismo orden, dada una semilla y un rango específicos. Por ejemplo:Generación de números aleatorios secuenciales distribuidos en Ruby 1.9.2
r = Random.new(23)
r.rand(100) # 83
r.rand(100) # 40
Pero supongamos que quiero generar el siguiente número en la secuencia en otro equipo (sin volver a generar los números anteriores en la secuencia). Esto debería ser posible, dado el resultado anterior. ¿Hay alguna manera de hacer esto con la clase Random
? ¿O tengo que escribir mi propia implementación del Mersenne twister?
[Editar: Como se señaló en los comentarios a continuación, no es de hecho posible determinar el estado de una instancia Random
sólo de la salida, porque sólo parte del estado (en concreto, los bajos 32 bits) se utilizan para la salida.]
¿Por qué debería ser posible hacer esto? – adamse
@adamse El siguiente número se genera determinísticamente dado algún estado interno en 'r'. Entonces, si crea una nueva 'r' con el mismo estado que la anterior, generará el siguiente número en la secuencia. ¿Tiene sentido? Según mi comprensión de los algoritmos que subyacen a "Aleatorio", creo que este estado se puede representar mediante la semilla y el último número generado. –
leyendo la implementación de [backported] (http://github.com/marcandre/backports/blob/master/lib/backports/1.9.2/random/MT19937.rb) parece que de hecho puede encontrar el siguiente estado usando el último y la semilla. Sin embargo, por lo que yo entiendo, es posible que no puedas encontrar el estado dado el número generado. – adamse