Queremos regalarte la mejor respuesta que hallamos en todo internet. Esperamos que te sirva de ayuda y si puedes compartir algo que nos pueda ayudar a perfeccionar nuestra información hazlo con total libertad.
Solución:
La sugerencia de Jarrett de usar una transformación Box-Muller es buena para una solución rápida y sucia. Una implementación sencilla:
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)
Esta pregunta parece haberse trasladado a la parte superior de Google para la generación gaussiana de .NET, así que pensé en publicar una respuesta.
Creé algunos métodos de extensión para la clase .NET Random, incluida una implementación de la transformación Box-Muller. Dado que son extensiones, siempre que se incluya el proyecto (o haga referencia a la DLL compilada), aún puede hacer
var r = new Random();
var x = r.NextGaussian();
Espero que a nadie le importe el enchufe desvergonzado.
Ejemplo de histograma de resultados (se incluye una aplicación de demostración para dibujar esto):
Math.NET proporciona esta funcionalidad. Así es cómo:
double mean = 100;
double stdDev = 10;
MathNet.Numerics.Distributions.Normal normalDist = new Normal(mean, stdDev);
double randomGaussianValue= normalDist.Sample();
Puede encontrar documentación aquí: http://numerics.mathdotnet.com/api/MathNet.Numerics.Distributions/Normal.htm
Comentarios y valoraciones del tutorial
Si te gustó nuestro trabajo, puedes dejar un ensayo acerca de qué te ha gustado de este enunciado.