A melhor maneira de fazer isso é gerar um número aleatório que é distribuído igualmente em um determinado conjunto de números e, em seguida, aplicar uma função de projeção ao conjunto entre 0 e 100, onde é mais provável que a projeção atinja os números desejados.
Normalmente, a maneira matemática de conseguir isso é traçar uma função de probabilidade dos números que você deseja. Poderíamos usar a curva de sino, mas, para facilitar o cálculo, basta trabalhar com uma parábola invertida.
Vamos fazer uma parábola de modo que suas raízes estejam em 0 e 100 sem distorcer. Obtemos a seguinte equação:
f(x) = -(x-0)(x-100) = -x * (x-100) = -x^2 + 100x
Agora, toda a área sob a curva entre 0 e 100 é representativa do nosso primeiro conjunto, onde queremos que os números sejam gerados. Lá, a geração é completamente aleatória. Então, tudo o que precisamos fazer é encontrar os limites do nosso primeiro set.
O limite inferior é, obviamente, 0. O limite superior é a integral da nossa função em 100, que é
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)
Portanto, sabemos que precisamos gerar um número entre 0 e 166.666. Então, simplesmente precisamos pegar esse número e projetá-lo em nosso segundo conjunto, que está entre 0 e 100.
Sabemos que o número aleatório que geramos é parte integrante de nossa parábola com uma entrada x entre 0 e 100. Isso significa que simplesmente temos que assumir que o número aleatório é o resultado de F (x) e resolver x.
Nesse caso, F (x) é uma equação cúbica e na forma F(x) = ax^3 + bx^2 + cx + d = 0
, as seguintes instruções são verdadeiras:
a = -1/3
b = 50
c = 0
d = -1 * (your random number)
Resolver isso para x fornece o número aleatório real que você está procurando, que é garantido no intervalo [0, 100] e tem uma probabilidade muito maior de estar próximo ao centro do que as bordas.