Aún más simple, dependiendo de la velocidad de su generador aleatorio, puede generar dos valores y promediarlos.
O, aún más simple, donde X es el resultado de la RNG, en primer lugar double y = double(1/x);
, x = y*[maximum return value of rng];
. Esto pesará los números exponencialmente a los números más bajos.
Genere y promedie más valores para aumentar la probabilidad de acercar los valores al centro.
Por supuesto, esto solo funciona para distribuciones de curvas de campana estándar o versiones "plegadas" de las mismas *, pero con un generador rápido, podría ser más rápido y sencillo que usar varias funciones matemáticas como sqrt.
Puede encontrar todo tipo de investigación sobre esto para las curvas de campana de dados. De hecho, Anydice.com es un buen sitio que genera gráficos para varios métodos de lanzar dados. Aunque está utilizando un RNG, la premisa es la misma, al igual que los resultados. Por lo tanto, es un buen lugar para ver la distribución incluso antes de codificarla.
* Además, puede "doblar" la distribución de resultados a lo largo de un eje tomando el eje y restando el resultado promedio y luego sumando el eje. Por ejemplo, desea que los valores más bajos sean más comunes, y digamos que quiere que 15 sea su valor mínimo y 35 sea su valor máximo, un rango de 20. Por lo tanto, genera y promedia dos valores con un rango de 20 ( dos veces el rango que desea), lo que dará una curva de campana centrada en 20 (restamos cinco al final para cambiar el rango de 20 a 40, de 15 a 35). Tome los números generados X e Y.
Número final,
z =(x+y)/2;// average them
If (z<20){z = (20-z)+20;}// fold if below axis
return z-5;// return value adjusted to desired range
Si cero es su mínimo, incluso mejor, haga esto en su lugar,
z= (x+y)/2;
If (z<20){z = 20-z;}
else {z = z - 20;}
return z;