Вот пример C ++, основанный на некоторых ссылках. Это быстро и грязно, вам лучше не изобретать и использовать библиотеку boost.
#include "math.h" // for RAND, and rand
double sampleNormal() {
double u = ((double) rand() / (RAND_MAX)) * 2 - 1;
double v = ((double) rand() / (RAND_MAX)) * 2 - 1;
double r = u * u + v * v;
if (r == 0 || r > 1) return sampleNormal();
double c = sqrt(-2 * log(r) / r);
return u * c;
}
Вы можете использовать график QQ для изучения результатов и посмотреть, насколько он приближается к реальному нормальному распределению (ранжируйте ваши образцы 1..x, превратите ряды в пропорции общего количества х, т. е. сколько образцов, получите значения z и запишите их. Прямая линия вверх - это желаемый результат).