Как лучше всего сгенерировать нормально распределенные случайные числа в C?

Мне нужно использовать в моей программе нормально распределенные случайные числа. Скажем, мне нужно сгенерировать x (размер R ^ (m x n)), элементы которого взяты из гауссовского распределения с нулевым средним и одной дисперсией. Как мне сделать это на C с хорошей точностью?


person user3727929    schedule 24.10.2014    source источник
comment
В этом ответе содержится код C, FWIW.   -  person HostileFork says dont trust SE    schedule 24.10.2014
comment
c-faq.com/lib/gaussian.html   -  person Grzegorz Szpetkowski    schedule 24.10.2014
comment
Обычно это делается с помощью преобразования Бокса-Мюллера.   -  person Dietrich Epp    schedule 24.10.2014


Ответы (1)


Существует множество алгоритмов для получения нормального распределения, если у вас есть однородный генератор случайных чисел. Взгляните на этот раздел статьи в Википедии. Один из возможных подходов - использование центральной предельной теоремы. Подход здесь состоит в том, чтобы сгенерировать множество целочисленных значений с равномерным распределением, а затем вычислить их среднее арифметическое.

person Ivaylo Strandjev    schedule 24.10.2014
comment
Самый практичный подход? Требуется дюжина однородных выборок, чтобы получить одну переменную, которая имеет хотя бы примерно нормальное распределение, и гораздо больше, чтобы получить лучшие приближения. Не похоже, что метод Бокса-Мюллера особенно сложен. Для этого нужны только квадратный корень, логарифм и тригонометрия, то есть libm. Вероятно, даже больше строк кода. - person ; 24.10.2014
comment
@delnan на самом деле я не прочитал все предложенные идеи. Я просто проделал нечто подобное с центральной предельной теоремой. Перефразирую ответ. - person Ivaylo Strandjev; 24.10.2014