Здравствуйте, Me_, Вы писали:
Me_>как сделать из равномерно распределенной последовательности случайных чисел нормально распределенную?
Me_>К примеру для показательного распределени: 1/L * ln(1/x), где — х — равномерно-рас. сл. величина, а L — интенсивность
Стандартное нормальное распределение:
n = sqrt(-2.0 * log(x)) * cos(2.0 * PI * x), где x — равномерно распределен в [0,1].
Здравствуйте, Sergey A. Sablin, Вы писали:
SAS>Стандартное нормальное распределение:
SAS>n = sqrt(-2.0 * log(x)) * cos(2.0 * PI * x), где x — равномерно распределен в [0,1].
SAS>для нормального со средним M и дисперсией D:
SAS>M + sqrt(D) * n
Здравствуйте, Me_, Вы писали:
Me_>Здравствуйте, Sergey A. Sablin, Вы писали:
SAS>>Стандартное нормальное распределение:
SAS>>n = sqrt(-2.0 * log(x)) * cos(2.0 * PI * x), где x — равномерно распределен в [0,1].
SAS>>для нормального со средним M и дисперсией D:
SAS>>M + sqrt(D) * n
Если бы я задался целью сделать самый настоящий генератор (псевдо) случайных чисел с нормальным распределением, то я бы взял десять разных генераторов случайных чисел и суммировал бы их вывод:
sch>Если бы я задался целью сделать самый настоящий генератор (псевдо) случайных чисел с нормальным распределением, то я бы взял десять разных генераторов случайных чисел и суммировал бы их вывод:
не знаю, за что человеку влепили минус, но это действительно на практике самый хороший алгоритм. Его прелесть в том, что даже если на входе не абсолютно равномерное распределение (например выход обычного сишного rand()), то на выходе все равно будет нормальное.
sch>Если бы я задался целью сделать самый настоящий генератор (псевдо) случайных чисел с нормальным распределением, то я бы взял десять разных генераторов случайных чисел и суммировал бы их вывод:
sch>float get_normal_rand() { sch> return (get_rand_1() + get_rand_2() + ... + get_rand_n()) / n; sch>}
sch>
Да, точно, это из центральной предельной теоремы следует.
Только если get_rand возвращает величину, равномерно распреденную от 0 до 1, то матожидание будет 1/2, а дисперсия 1/12/n, т.е. надо еще сдвинуть и отмасштабировать.
Именно поэтому LelicDsp пишет про 12 чисел:
(get_rand_1() + get_rand_2() + ... + get_rand_12())-6
вот это будет то, что нужно.
Или, если 12 кому-то мало, то
(get_rand_1() + get_rand_2() + ... + get_rand_48())/2-12
Здравствуйте, Sergey A. Sablin, Вы писали:
SAS>Стандартное нормальное распределение:
SAS>n = sqrt(-2.0 * log(x)) * cos(2.0 * PI * x), где x — равномерно распределен в [0,1].
Это неправда!!!!
Из двух случайных величин x и y, независимых и равномерно распределенных в [0,1] получаются 2 независимые величины со стандартным нормальным распределением:
Здравствуйте, kfmn, Вы писали:
K>Только если get_rand возвращает величину, равномерно распреденную от 0 до 1, то матожидание будет 1/2, а дисперсия 1/12/n, т.е. надо еще сдвинуть и отмасштабировать.
K>Именно поэтому LelicDsp пишет про 12 чисел: K>(get_rand_1() + get_rand_2() + ... + get_rand_12())-6 K>вот это будет то, что нужно.
K>Или, если 12 кому-то мало, то K>(get_rand_1() + get_rand_2() + ... + get_rand_48())/2-12
что-то она слишком нормальная получается в этом случае, можно как-нибудь увеличить дисперсию до единицы?