uniforme rango randomizar numeros normal generar generador generacion distribucion continua como aleatorios aleatorio aleatorias random gaussian normal-distribution

random - rango - numeros aleatorios en excel



Número aleatorio dentro de un rango basado en una distribución normal (6)

Aquí hay otro algoritmo que no necesita calcular Sin / Cos, ni necesita saber Pi. No me preguntes sobre los antecedentes teóricos. Lo encontré en algún lugar una vez y es lo que he estado usando desde entonces. Sospecho que es una especie de normalización de la misma transformación de Box-Muller que @Will Vousden menciona. También produce resultados en pares.

El ejemplo es VBscript; lo suficientemente fácil de convertir a cualquier otro idioma.

Sub calcRandomGauss (byref y1, byref y2) Dim x1, x2, w Do x1 = 2.0 * Rnd() - 1.0 x2 = 2.0 * Rnd() - 1.0 w = x1 * x1 + x2 * x2 Loop While w >= 1.0 Or w = 0 ''edited this line, thanks Richard w = Sqr((-2.0 * Log(w)) / w ) y1 = x1 * w y2 = x2 * w End Sub

Quiero generar números aleatorios con un rango (n a m, por ejemplo, de 100 a 150), pero en lugar de ser puramente aleatorios, quiero que los resultados se basen en la distribución normal.

Con esto quiero decir que en general quiero los números "agrupados" alrededor de 125.

Encontré este paquete de números aleatorios que parece tener mucho de lo que necesito: http://codeproject.com/KB/recipes/Random.aspx

Es compatible con una variedad de generadores aleatorios (incluido mersiene twister) y puede aplicar el generador a una distribución.

Pero estoy confundido, si uso un generador de distribución normal los números aleatorios son de aproximadamente -6 a +8 (aparentemente el verdadero rango es float.min a float.max).

¿Cómo hacer una escala de mi rango requerido?


En aras del interés, es bastante sencillo generar números aleatorios distribuidos normalmente a partir de un RNG uniforme (aunque debe hacerse en pares):

Random rng = new Random(); double r = Math.Sqrt(-2 * Math.Log(rng.NextDouble())); double θ = 2 * Math.Pi * rng.NextDouble(); double x = r * Math.Cos(θ); double y = r * Math.Sin(θ);

y ahora contienen dos números aleatorios distribuidos normalmente independientes con media 0 y varianza 1. Puede escalar y traducirlos según sea necesario para obtener el rango que desea (como explica interjay).

Explicación:

Este método se llama transformación Box-Muller . Utiliza la propiedad de la unidad bidimensional gaussiana de que el valor de densidad en sí mismo, p = exp(-r^2/2) , se distribuye uniformemente entre 0 y 1 (la constante de normalización se elimina por simplicidad).

Dado que puede generar dicho valor fácilmente usando un RNG uniforme, termina con un contorno circular de radio r = sqrt(-2 * log(p)) . A continuación, puede generar una segunda variante aleatoria uniforme entre 0 y 2*pi para darle un ángulo θ que define un punto único en su contorno circular. Finalmente, puede generar dos i.i.d. aleatorias normales al transformar las coordenadas polares (r, θ) en coordenadas cartesianas (x, y) .

Esta propiedad, que p se distribuye de manera uniforme, no es válida para otras dimensionalidades, por lo que debe generar exactamente dos variables normales a la vez.


Esto puede ser demasiado simplista para sus necesidades, pero una forma rápida y económica de obtener un número aleatorio con una distribución que se base en el centro es simplemente agregar 2 (o más) números aleatorios.

Piensa cuando lanzas dos dados de 6 caras y los agregas. La suma suele ser 7, luego 6 y 8, luego 5 y 9, etc. y solo raramente 2 o 12.


La respuesta de tzaman es correcta, pero cuando usa la biblioteca que ha enlazado, hay una manera más simple que realizar el cálculo usted mismo: El objeto de NormalDistribution tiene propiedades modificables Mu (que significa la media) y Sigma (desviación estándar). Entonces, yendo por los números de tzaman, configure Mu a 125 y Sigma a 8.333.


Un enfoque diferente a este problema utiliza la distribución beta (que tiene un rango difícil, a diferencia de la distribución normal) e implica elegir los parámetros apropiados de manera que la distribución tenga la media y la desviación estándar dadas (raíz cuadrada de la varianza). Ver esta pregunta


Una distribución normal estándar tiene una media de 0 y una desviación estándar de 1; si quieres hacer una distribución con media m y desviación s , simplemente multiplica por s y luego agrega m . Dado que la distribución normal es teóricamente infinita, no puede tener un tope fijo en su rango, por ejemplo (100 a 150) sin rechazar explícitamente los números que quedan fuera de él, pero con una opción de desviación adecuada puede estar seguro de que (por ejemplo) 99% de tus números estarán dentro del rango.

Aproximadamente el 99.7% de una población está dentro de +/- 3 desviaciones estándar, por lo que si (25/3) tuyo (25/3) , debería funcionar bien.

Entonces quieres algo como: (normal * 8.333) + 125