Ancora più semplice, a seconda della velocità del tuo generatore casuale, puoi semplicemente generare due valori e mediarli.
O, ancora più semplice, dove X è il risultato dell'rng, prima di tutto double y = double(1/x);
,x = y*[maximum return value of rng];
. Questo peserà i numeri in modo esponenziale rispetto ai numeri più bassi.
Generare e mediare più valori per aumentare la probabilità di avvicinare i valori al centro.
Ovviamente questo funziona solo per le distribuzioni standard delle curve a campana o le versioni "piegate" *, ma con un generatore veloce, potrebbe essere più veloce e più semplice rispetto all'utilizzo di varie funzioni matematiche come sqrt.
Puoi trovare tutti i tipi di ricerche su questo per le curve a campana dei dadi. In effetti, Anydice.com è un buon sito che genera grafici per vari metodi di lancio dei dadi. Sebbene tu stia usando un RNG, la premessa è la stessa, così come i risultati. Quindi è un buon posto per vedere la distribuzione prima ancora di codificarla.
* Inoltre, è possibile "piegare" la distribuzione del risultato lungo un asse prendendo l'asse e sottraendo il risultato medio quindi aggiungendo l'asse. Ad esempio, vuoi che i valori più bassi siano più comuni e diciamo che vuoi che 15 sia il tuo valore minimo e 35 che sia il tuo valore massimo, un intervallo di 20. Quindi generi e media insieme due valori con un intervallo di 20 ( il doppio dell'intervallo desiderato), che fornirà una campana centrata su 20 (sottraggiamo cinque alla fine per spostare l'intervallo da 20 a 40, da 15 a 35). Prendi i numeri generati X e Y.
Numero finale,
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 è il tuo minimo, ancora meglio, fallo invece,
z= (x+y)/2;
If (z<20){z = 20-z;}
else {z = z - 20;}
return z;