2011-02-28 15 views
6

Estoy tratando de aprender el nuevo enfoque de C++ 0x para generadores de números aleatorios (26.5), e implementar en un motor de números aleatorios compatible con C++ 0x (26.5.1.4).¿Cuál es la forma estándar de obtener el estado de un generador de números aleatorios C++ 0x?

La norma entra en detalle en la interfaz requerida para las secuencias semilla, y cómo se pueden pasar al constructor o a las funciones seed de los motores.

Sin embargo, no encuentro ninguna interfaz estándar para crear o generar una secuencia inicial de un motor, obteniendo así su estado interno. ¿Hay alguno? ¿O pueden los estados solo copiarse entre motores mediante copy-construction/assignment o copiando la secuencia de inicial seed?

Si no es posible, ¿alguien sabe cuál es la razón (si la hay) para no proporcionar dicha interfaz?

+1

Esto supone que cualquier estado se puede lograr mediante una secuencia de inicialización. ¿Es esa una suposición correcta para empezar? – MSalters

+0

@MSalters: Creo que sí, o al menos creo que no sería una restricción onerosa. El estado interno de cualquier cálculo es representable como una serie de enteros. –

Respuesta

7

No hay API para generar una secuencia de semilla o semilla a partir del estado de un motor. Sin embargo, el estado del motor se puede transmitir en una corriente isotérmica y extraerse de un ostream. Y el estado del motor es EqualityComparable al estado de otro motor (para motores del mismo tipo).

Uno podría inspeccionar la corriente generada por la transmisión de un motor a la misma. Sin embargo, el formato de esa istream no está especificado.

0

Eso es lo que yo también entiendo. (Para ser claros: creo que los estados solo se pueden copiar entre motores mediante copy-construction/assignment o construir con la misma secuencia de inicialización y habiendo generado el mismo número de números pseudoaleatorios).

0

El estado interno no tiene que parecerse en nada a la secuencia de inicialización. Creo que esto es casi pedirle al compilador el código fuente de un binario. Imposible.

Sin embargo, puede copiar todo el motor y hacer que la copia vuelva a generar la misma secuencia una vez más. O puede transmitir el estado a un archivo y volver a cargarlo.

+0

_El estado interno no tiene que parecerse en nada a la secuencia de inicialización. Sin embargo, dado que la secuencia de inicialización no tiene un efecto estándar en un motor que no sea inicializar su estado interno, no parece haber ninguna razón para que el estándar no requiera eso. El amplio munging de la secuencia de semillas para establecer su estado en realidad no le gana nada. –

+0

@Joe: Quizás no, pero eso es exactamente lo que el estándar requiere que hagan la mayoría de los motores. El motor establece su estado a partir de los parámetros de la secuencia de inicialización, no solo almacena la secuencia. –

+0

Simplemente generando n elementos de la secuencia de inicialización y copiando cada uno en su estado interno, ya que cada RNG del que soy consciente (que, sin embargo, ¡ciertamente no es todo!) Lo hace, no impide la regeneración de la secuencia. De hecho, significa que es trivial hacerlo, simplemente copie su estado interno de nuevo. No puedo pensar en un caso en el que un munging irreversible de la secuencia de semillas presente un beneficio. –

Cuestiones relacionadas