La mejor manera de hacerlo es generar un número aleatorio que se distribuya equitativamente en un determinado conjunto de números, y luego aplicar una función de proyección al conjunto entre 0 y 100, donde la proyección es más probable que llegue a los números que desea.
Por lo general, la forma matemática de lograr esto es trazar una función de probabilidad de los números que desea. Podríamos usar la curva de campana, pero en aras de un cálculo más fácil, simplemente trabajemos con una parábola invertida.
Hagamos una parábola de modo que sus raíces estén en 0 y 100 sin sesgarla. Obtenemos la siguiente ecuación:
f(x) = -(x-0)(x-100) = -x * (x-100) = -x^2 + 100x
Ahora, toda el área bajo la curva entre 0 y 100 es representativa de nuestro primer conjunto donde queremos que se generen los números. Allí, la generación es completamente al azar. Entonces, todo lo que necesitamos hacer es encontrar los límites de nuestro primer conjunto.
El límite inferior es, por supuesto, 0. El límite superior es la integral de nuestra función en 100, que es
F(x) = -x^3/3 + 50x^2
F(100) = 500,000/3 = 166,666.66666 (let's just use 166,666, because rounding up would make the target out of bounds)
Entonces sabemos que necesitamos generar un número en algún lugar entre 0 y 166,666. Luego, simplemente necesitamos tomar ese número y proyectarlo en nuestro segundo conjunto, que está entre 0 y 100.
Sabemos que el número aleatorio que generamos es parte integral de nuestra parábola con una entrada x entre 0 y 100. Eso significa que simplemente tenemos que suponer que el número aleatorio es el resultado de F (x) y resolver para x.
En este caso, F (x) es una ecuación cúbica, y en la forma F(x) = ax^3 + bx^2 + cx + d = 0
, las siguientes afirmaciones son verdaderas:
a = -1/3
b = 50
c = 0
d = -1 * (your random number)
Resolver esto para x te da el número aleatorio real que estás buscando, que está garantizado en el rango [0, 100] y una probabilidad mucho mayor de estar cerca del centro que los bordes.