Я намагаюся написати функцію C ++, яка повертає випадкові значення Гаусса, враховуючи їх засоби та відхилення.
Існує функція бібліотеки rand()
, яка повертає випадкові числа між 0
і RAND_MAX
. RAND_MAX
не має фіксованого значення, але гарантується, що воно буде принаймні . Її PDF є рівномірним.
Я використовую центральну граничну теорему, щоб перетворити це rand()
в гауссову змінну. Що я саме роблю, - це зателефонувати rand()
в заданий користувачем час, потім скласти свої повернені значення, а потім перенести його середнє значення на вказане користувачем середнє.
На графіку, поданому вище, я назвав свій випадковий генератор Гаусса протягом разів і побудував частоти його повернених значень. Як бачите, його дисперсія величезна, оскільки створюється сумою безлічі інших випадкових значень.
Він успішно повертає гауссову змінну з гауссовим PDF та із заданим середнім значенням. Однак проблема полягає в його дисперсії. Я затримався на цьому етапі, тому що я не знаю, як змінити його відхилення на вказане користувачем значення.
Це мій код (наразі неповний; параметр "Варіант" ігнорується):
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);
}
Припустимо, що NUM_GAUSSIAN_SUMS
це 100, і RAND_MAX
це 32767.
Я хочу змінити дисперсію випадкової величини відповідно до параметра функції. Моє запитання: як я можу змінити дисперсію цієї випадкової величини? Як я можу це зробити?