Sto cercando di scrivere una funzione C ++ che restituirà valori casuali gaussiani, dati i loro mezzi e varianze.
C'è una funzione di libreria rand()
, che restituisce numeri casuali tra 0
e RAND_MAX
. RAND_MAX
non ha un valore fisso, ma è garantito che sarà almeno . Il suo PDF è uniforme.
Sto usando il Teorema del limite centrale per trasformare questo rand()
in una variabile gaussiana. Quello che sto facendo esattamente è chiamare gli rand()
orari specificati dall'utente, quindi sommare i loro valori di ritorno, quindi spostare la sua media sulla media specificata dall'utente.
Nel grafico sopra, ho chiamato il mio generatore casuale gaussiano per volte, e ho tracciato le frequenze dei suoi valori di ritorno. Come vedi, la sua varianza è enorme, poiché è creata dalla somma di molti altri valori casuali.
Restituisce correttamente una variabile gaussiana con un PDF gaussiano e con il valore medio specificato. Tuttavia, il problema è la sua varianza. Sono bloccato a questo punto, perché non so come modificarne la varianza con il valore specificato dall'utente.
Questo è il mio codice (per il momento incompleto; il parametro "Varianza" viene ignorato):
template <class T>
T Random::GetGaussian(T Mean /*= 0*/, T Variance /*= 1*/)
{
T MeanOfSum = NUM_GAUSSIAN_SUMS / static_cast<T>(2);
T Rand = 0;
for (uint64_t i=0; i<NUM_GAUSSIAN_SUMS; i++)
{
Rand += static_cast<T>(rand()) / RAND_MAX;
}
return Rand - (MeanOfSum - Mean);
}
Supponiamo che NUM_GAUSSIAN_SUMS
sia 100 e RAND_MAX
32767.
Voglio cambiare la varianza della variabile casuale in base al parametro della funzione. La mia domanda è: come posso cambiare la varianza di questa variabile casuale? Come posso farlo?