Ainda mais simples, dependendo da velocidade do seu gerador aleatório, você pode apenas gerar dois valores e fazer a média deles.
Ou, ainda mais simples, onde X é o resultado do RNG, em primeiro lugar double y = double(1/x);
, x = y*[maximum return value of rng];
. Isso ponderará os números exponencialmente para os números mais baixos.
Gere e calcule a média de mais valores para aumentar a probabilidade de obter valores mais próximos do centro.
Obviamente, isso só funciona para distribuições padrão de curvas em sino ou versões "dobradas" *, mas com um gerador rápido, pode ser mais rápido e mais simples do que usar várias funções matemáticas como o sqrt.
Você pode encontrar todo tipo de pesquisa sobre curvas de sino de dados. De fato, o Anydice.com é um bom site que gera gráficos para vários métodos de rolar dados. Embora você esteja usando um RNG, a premissa é a mesma, assim como os resultados. Portanto, é um bom local para ver a distribuição antes mesmo de codificá-la.
* Além disso, você pode "dobrar" a distribuição de resultados ao longo de um eixo, pegando o eixo e subtraindo o resultado médio e adicionando o eixo. Por exemplo, você deseja que valores mais baixos sejam mais comuns e digamos que você queira 15 como seu valor mínimo e 35 como seu valor máximo, um intervalo de 20. Portanto, você gera e calcula a média de dois valores com um intervalo de 20 ( duas vezes o intervalo que você deseja), o que fornecerá uma curva de sino centralizada em 20 (subtraímos cinco no final para alterar o intervalo de 20 para 40 para 15 para 35). Pegue os números gerados 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
Se zero é o seu mínimo, melhor ainda, faça isso em vez disso,
z= (x+y)/2;
If (z<20){z = 20-z;}
else {z = z - 20;}
return z;