Encore plus simple, selon la vitesse de votre générateur aléatoire, vous pouvez simplement générer deux valeurs et les faire la moyenne.
Ou, encore plus simple, où X est le résultat de la RNG, d' abord double y = double(1/x);
, x = y*[maximum return value of rng];
. Cela pondérera les nombres de façon exponentielle aux nombres inférieurs.
Générez et faites la moyenne de plus de valeurs pour augmenter la probabilité de rapprocher les valeurs du centre.
Bien sûr, cela ne fonctionne que pour les distributions de courbes en cloche standard ou leurs versions "pliées" *, mais avec un générateur rapide, cela pourrait être plus rapide et plus simple que d'utiliser diverses fonctions mathématiques comme sqrt.
Vous pouvez trouver toutes sortes de recherches à ce sujet pour les courbes de cloche de dés. En fait, Anydice.com est un bon site qui génère des graphiques pour différentes méthodes de lancer de dés. Bien que vous utilisiez un RNG, la prémisse est la même, tout comme les résultats. C'est donc un bon endroit pour voir la distribution avant même de la coder.
* De plus, vous pouvez "plier" la distribution des résultats le long d'un axe en prenant l'axe et en soustrayant le résultat moyen puis en ajoutant l'axe. Par exemple, vous voulez que les valeurs inférieures soient plus courantes, et disons que vous voulez que 15 soit votre valeur minimale et 35 soit votre valeur maximale, une plage de 20. Ainsi, vous générez et faites la moyenne ensemble de deux valeurs avec une plage de 20 ( deux fois la plage que vous voulez), ce qui donnera une courbe en cloche centrée sur 20 (nous soustrayons cinq à la fin pour déplacer la plage de 20 à 40, à 15 à 35). Prenez les nombres générés X et Y.
Numéro 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 zéro est votre minimum, encore mieux, faites-le à la place,
z= (x+y)/2;
If (z<20){z = 20-z;}
else {z = z - 20;}
return z;