Hay una clase en la biblioteca estándar de .NETA que me da la funcionalidad para crear variables aleatorias que siguen a la distribución de Gauss?

  • http://mathworld.wolfram.com/Box-MullerTransformation.html el Uso de dos variables aleatorias, puede generar valores aleatorios a lo largo de una distribución de Gauss. No es una tarea difícil en absoluto.
  • Me gustaría añadir un resultado matemático que no es inmediatamente útil para distribuciones Normales (debido a la complejidad de CDF), pero es útil para muchas otras distribuciones. Si pones uniformemente distribuidos al azar los números en [0,1] (con Random.NextDouble()) a la inversa de la CDF de distribución, usted va a obtener números aleatorios que siguen la distribución. Si la aplicación no necesita precisamente variables normalmente distribuidas, entonces la Distribución Logística es una muy buena aproximación normal y tiene una fácilmente invertible CDF.
  • El MedallionRandom paquete de NuGet contiene un método de extensión para recuperar normalmente distribuidos los valores de una Random el uso de la Box-Muller de transformación (mencionado en varias respuestas abajo).

12 Comentarios

  1. 168

    De Jarrett sugerencia de utilizar un Box-Muller transformar es bueno para una rápida y sucia de la solución. Una implementación simple:

    Random rand = new Random(); //reuse this if you are generating many
    double u1 = 1.0-rand.NextDouble(); //uniform(0,1] random doubles
    double u2 = 1.0-rand.NextDouble();
    double randStdNormal = Math.Sqrt(-2.0 * Math.Log(u1)) *
                 Math.Sin(2.0 * Math.PI * u2); //random normal(0,1)
    double randNormal =
                 mean + stdDev * randStdNormal; //random normal(mean,stdDev^2)
    • He probado y comparado con MathNet de Mersenne Twister RNG y NormalDistribution. Su versión es más de dos veces tan rápido y el resultado final es básicamente el mismo (inspección visual de las «campanas»).
    • si usted está buscando para la velocidad pura, entonces el Zigorat Algoritmo es generalmente reconocido como el más rápido de enfoque. Además, el enfoque anterior se puede acelerar mediante la realización de un valor de una llamada a la siguiente.
    • Hola, ¿qué debe hacer el stdDev variable se establece? Entiendo que esto puede ser configurado para requisitos específicos, pero hay límites (es decir, los valores max/min)?
    • stdDev es el parámetro de escala de la distribución normal, que puede ser cualquier número positivo. El más grande es, más que dispersar a los números generados serán. Para una distribución normal estándar el uso de los parámetros media=0 y stdDev=1.
    • Creo que u1 debe ser 1 - rand.NextDouble() para evitar el registro(0)=Inf. El valor devuelto de los números por NextDouble() son mayores o iguales que 0 y menor que 1.
    • buen punto, corregido
    • No necesita de las Matemáticas.Abs() alrededor del parámetro a de Matemáticas.La función Sqrt()? doble randStdNormal = Matemáticas.Sqrt(De Matemáticas.Abs(-2 * Matemáticas.Log(u1) * Matemáticas.Sin(2 * Math.PI * u2)));
    • Yo no lo creo. Sólo el -2*Matemáticas.Log(u1) está dentro de la raíz cuadrada, y el registro será siempre negativo o cero, ya u1<=1
    • He utilizado la fórmula anterior y una gráfica en Excel. No es suficiente la distribución Gaussiana si usted está haciendo el trabajo científico como yo. El uso de este lugar: docs.microsoft.com/en-us/dotnet/api/…

  2. 55

    Esta pregunta parece que se han movido en la parte superior de Google .RED de Gauss generación, así que pensé en publicar una respuesta.

    He hecho algunos los métodos de extensión para el .RED de clase al Azar, incluyendo una aplicación de la Box-Muller transformar. Ya que son extensiones, siempre y cuando el proyecto se incluye (o se hace referencia a la DLL compilada), usted todavía puede hacer

    var r = new Random();
    var x = r.NextGaussian();

    Esperanza a nadie le importa el enchufe descarado.

    Muestra el histograma de los resultados (un demo de la aplicación para la elaboración de este se incluye):

    Aleatorio Gaussiano Variables

    • La extensión de la clase tiene un par de cosas que yo estaba buscando! gracias!
    • tienes un pequeño error en su NextGaussian método. NextDouble() Devuelve un aleatoria número de punto flotante que es mayor o igual a 0.0 y menor a 1.0. Así que usted debe tener u1 = 1.0 – NextDouble() …. otras de registro(0) va a explotar
  3. 17

    Math.NET proporciona esta funcionalidad. He aquí cómo:

    double mean = 100;
    double stdDev = 10;
    
    MathNet.Numerics.Distributions.Normal normalDist = new Normal(mean, stdDev);
    double randomGaussianValue=   normalDist.Sample();

    Puede encontrar la documentación aquí:
    http://numerics.mathdotnet.com/api/MathNet.Numerics.Distributions/Normal.htm

    • Gran respuesta! Esta función está disponible en NuGet en el MathNet.Numerics paquete. Siempre genial no tener que rodar sus propios.
  4. 7

    He creado una petición para una característica en Microsoft Connect. Si esto es algo que usted está buscando, por favor voten por ella y el aumento de su visibilidad.

    https://connect.microsoft.com/VisualStudio/feedback/details/634346/guassian-normal-distribution-random-numbers

    Esta característica está incluida en el SDK de Java. Su aplicación está disponible como parte de la documentación y es fácilmente portado a C# u otro .NET languages.

    Si usted está buscando para la velocidad pura, entonces la Zigorat Algoritmo es generalmente reconocido como el más rápido de enfoque.

    Yo no soy un experto en este tema a pesar de que — me encontré con la necesidad de este, mientras que la implementación de un filtro de partículas para mi RoboCup simulado en 3D de fútbol robótico de la biblioteca y se sorprendió cuando este no estaba incluido en el framework.


    En el mientras tanto, aquí hay un contenedor para Random que proporciona una implementación eficiente de la Caja Muller polar método:

    • Tengo algunas -cinco valores de aunque. alguien puede comprobar lo que está mal?
    • una función de probabilidad Gaussiana centrada en torno a cero es igual de probable que dar valores negativos como es dar valores positivos.
    • Estás en lo cierto! Ya me gustaría obtener una lista de peso en una típica población con gaussiano PDF, estoy configuración de mu, digamos, 75 [kg] y sigma 10. ¿Tengo que crear una nueva instancia de GaussianRandom para la generación de cada peso aleatorio ?
    • Usted puede mantener el dibujo de las muestras de la instancia de uno.
  5. 5

    Math.NET Iridium también pretende implementar «no-aleatorio uniforme generadores (normal, poisson, binomial, …)».

    • Pero no su trabajo correctamente. Trató de parcela, Dando aleatorio uniforme no.
  6. 4

    Aquí es otro rápido y sucio solución para la generación de variables aleatorias que son normal distribuido. Dibuja algún punto arbitrario (x,y) y comprueba si este punto se encuentra bajo la curva de la función de densidad de probabilidad, de lo contrario repita.

    Bono: Usted puede generar variables aleatorias para cualquier otra distribución (por ejemplo, la distribución exponencial o distribución de poisson) reemplazando la función de densidad.

    Importante: Seleccione el intervalo de y y los parámetros σ y μ de modo que la curva de la función no es de corte en su máximo/mínimo de puntos (por ejemplo, en x=media). Creo que de los intervalos de x y y como un cuadro delimitador, en la que la curva debe ajustarse en.

    • Tangenial, pero esta es realmente la primera vez que me he dado cuenta de que puede utilizar Unicode símbolos de variables en lugar de algo tonto como _sigma o _phi…
    • Agradezco a todos los desarrolladores para el uso de ‘algo tonto’ 😐
  7. 2

    Me gustaría ampliar @yoyoyoyosef la respuesta de lo que es incluso más rápido, y la escritura de una clase contenedora. La sobrecarga que se produce no puede significar el doble de rápido, pero creo que debería ser casi el doble de rápido. No es thread-safe, aunque.

  8. 1

    Ampliando Drew Noakes la respuesta, si usted necesita un mejor rendimiento de Box-Muller (alrededor de 50% a 75% más rápido), Colin Green ha compartido una implementación del Zigurat algoritmo en C#, que se puede encontrar aquí:

    http://heliosphan.org/zigguratalgorithm/zigguratalgorithm.html

    Zigurat utiliza una tabla de búsqueda para manejar los valores que se encuentran lo suficientemente lejos de la curva, que serán rápidamente aceptar o rechazar. Alrededor del 2,5% del tiempo, tiene que hacer más cálculos para determinar qué lado de la curva de un número.

  9. 1

    La expansión de @Noakes y @Hameer respuestas, me han implantado un ‘Gaussian’ de la clase, pero para simplificar el espacio de la memoria, me la hizo un niño de la clase al Azar para que usted también puede llamar a la básica Next(), NextDouble(), etc de la Gaussiana de la clase sin tener que crear un Aleatorio adicional para manejarlo. También he eliminado la _available, y _nextgauss global de las propiedades de la clase, ya que no me ven como necesario ya que esta clase de instancia de base, debe ser seguro para subprocesos, si se dan uno al hilo de su propio objeto de Gauss. También he movido todo el tiempo de ejecución asignados variables de la función y los hizo propiedades de la clase, esto reducirá el número de llamadas para el administrador de memoria desde el 4 dobles teóricamente debería nunca ser de-asignado hasta que el objeto se destruye.

    • Las variables locales son amigos también.
  10. 0

    Usted podría tratar de Infer.NET. No comercial con licencia aún a pesar de que. Aquí hay enlace

    Es un marco probabilístico para .NET desarrollado mi investigación de Microsoft. Ellos tienen .Tipos de redes para la distribución de Bernoulli, Beta, Gamma, Gaussiano, de Poisson, y probablemente algunos más que me quede fuera.

    Que puede lograr lo que usted desea. Gracias.

  11. 0

    Este es mi sencillo Cuadro de Muller inspirado aplicación. Usted puede aumentar la resolución para que se ajuste a sus necesidades. Aunque esto funciona bien para mí, este es un rango limitado de aproximación, a fin de mantener en mente las colas son cerrado y finito, pero sin duda se puede ampliar según sea necesario.

    • Este es mi sencillo Cuadro de Muller inspirado aplicación. Usted puede aumentar la resolución para que se ajuste a sus necesidades. Esto es muy rápido, sencillo, y funciona para mi red neuronal de las aplicaciones que necesita un aproximado de Gauss tipo de función de densidad de probabilidad para hacer el trabajo. Espero que ayude a alguien a ahorrar tiempo y ciclos de CPU. Aunque esto funciona bien para mí, este es un rango limitado de aproximación, a fin de mantener en mente las colas son cerrado y finito, pero sin duda se puede ampliar según sea necesario.
    • Hola Daniel, he sugerido una edición que incorpora la descripción de su comentario a la respuesta en sí. También se elimina el ‘//’ que estaba comentando el código real en su respuesta. Usted puede hacer la edición ti mismo si quieres / si se rechaza 🙂
  12. -1

    Creo que no hay. Y realmente espero que no la hay, como el marco ya está hinchado suficiente, sin especializados funcionalidad de llenado aún más.

    Echa un vistazo a http://www.extremeoptimization.com/Statistics/UsersGuide/ContinuousDistributions/NormalDistribution.aspx y http://www.vbforums.com/showthread.php?t=488959 para un tercero .NET solutions, aunque.

    • Desde cuándo es la distribución de Gauss ‘especializados’? Es mucho más general que, por ejemplo, AJAX o tablas de datos.
    • está usted seriamente, tratando de sugerir que más utilizan los desarrolladores de la distribución Gaussiana de uso de AJAX en una base regular?
    • Posiblemente; lo que estoy diciendo es que es mucho más especializados. Sólo tiene un uso – aplicaciones web. Distribución gausiana tienen una increíble cantidad de usos no relacionados.
    • está usted en serio lo que sugiere menor funcionalidad mejora de un marco.
    • Sí. Esto parece una obviedad para mí. Los mejores marcos para la asignación de funcionalidad marcos. Cocina-fregadero marcos son una pesadilla para aprender y usar. Son las que mejor van en el JEE mundo.
    • para citar un ejemplo concreto, creo que la decisión de hacer MVC un marco independiente, en lugar de ser parte de la principal .NET framework, que fue bueno.
    • la modularidad es un buen argumento.
    • pero se podría poner en las matemáticas lib como una extensión para el azar 🙂

Dejar respuesta

Please enter your comment!
Please enter your name here