Pregunta

Estoy usando una implementación de C# de Mersenne Twister de la que descargué Espacio central. Tengo dos problemas con eso:

  1. No importa cómo sembro el algoritmo, no pasa Pruebas acérrimos, y con eso quiero decir, obtengo muchos 1s y 0 para el valor p. También mi KSTEST en 269 valores p es 0. Bueno, no puedo interpretar el valor p, pero creo que algunos 1s y 0 en el resultado son malas noticias.
  2. Me han pedido que muestre visualmente la aleatoriedad de los números. Así que traigo los números a medida que se generan, y esto no parece aleatorio en absoluto. Aquí hay dos capturas de pantalla del resultado Después de unos segundos y unos segundos después. Como puede ver en la segunda captura de pantalla, los números caen en algunas líneas paralelas. He probado diferentes algoritmos para asignar números a puntos. ¡Todos dan como resultado líneas paralelas, pero con diferentes ángulos! Así es como mapeé los números para puntos para estas capturas de pantalla: new Point(number % _canvasWidth, number % _canvasHeight). Como puede adivinar, el resultado visual depende del ancho y la altura del formulario, y esto es un resultado desastroso.

Aquí hay algunas maneras en que intenté sembrar el algoritmo:

  1. Entrada de usuario. Entro algunos números para sembrar el algoritmo como una matriz int.
  2. ¡Números aleatorios generados por el algoritmo en sí!
  3. Una variedad de new Guid().GetHashCode()

¿Que me estoy perdiendo aqui? ¿Cómo debo sembrar el algoritmo? ¿Cómo puedo conseguir que pase el acérrimo?

¿Fue útil?

Solución

Si bien no puedo hablar con su primer punto, el segundo problema tiene que ver con cómo está calculando los puntos para recurrir. Específicamente,

x = number % _canvasWidth;
y = number % _canvasHeight;

Te dará un "patrón" que corresponde un poco a la relación de aspecto de la ventana a la que está dibujando. Por ejemplo, si _canvasWidth y _canvasHeight eran iguales, siempre dibujarías en una sola línea diagonal como x y y siempre sería lo mismo. Esta representación gráfica no sería apropiada en este caso, entonces.

¿Qué hay de tomar los n bits de la salida RNG y usar la mitad para la coordenada X y la otra mitad para la coordenada Y? Para esos bits que caen de los límites de su ventana, es posible que desee considerar dos opciones:

  1. No los dibujes (o los dibujes fuera de la pantalla)
  2. Realice una interpolación lineal para mapear el rango de bits al ancho/altura de su ventana

Cualquiera de las opciones debería darle una imagen más representativa de los bits que está obteniendo de su generador de números aleatorios. ¡Buena suerte!

Otros consejos

Su problema de planificación de puntos a rayas debe solucionarse fácilmente generando un nuevo número aleatorio para cada una de las coordenadas X e Y. Intentar reutilizar un solo número generado para X e Y es básicamente una optimización prematura, pero si baja esa ruta, asegúrese de extraer diferentes bits para cada uno del número; como es, x=n%width;y=n%height Le da una enorme correlación entre X e Y, como se puede ver en sus imágenes.

He estado usando varias implementaciones de C ++ Mersenne Twister durante años (más recientemente impulsar's) para generar aleatorio puntos y no tenía dificultades con él (relacionadas con semillas o no). Realmente es un generador excelente.

Verdadero aleatorio La generación de números no se puede hacer con una función matemática. Si es importante tener números verdaderamente aleatorios, obtenga un Generador de números aleatorios de hardware. He desarrollado juegos de póker en línea de dinero real: tal hardware es la única forma de confiar en que no hay patrones en los números.

Si se dirige a un entorno de Linux, el /dev/De Random y/dev/urandom Pseudo dispositivos Haga mucho mejor que un generador matemático, ya que incorporan números aleatorios que representan la actividad de hardware.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top