Здесь используется ЦПТ. Суть ее в том, что ты генеришь несколько выборок распределенных по равномерному закону (обычно от 12 выборок, но в вашем коде почему то только 6 (n=6)), а затем объединяешь их в одну выборку и получается нормальная выборка с параметрами 0;1.
z.append((v[i]-(n/2.0))/sqrt(n/12.0));
это и есть объединение всех выборок в одну выборку.
Так как нам нужна нормальная выборка, но с другими параметрами вы делаем следующие
Вот здесь написано как можно моделировать нормальное распределение. (
http://ru.wikipedia.org/wiki/%D0%9D%D0%BE%D1%80%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5). Я сам раньше использовал для этого преобразование Бокса-Мюллера. Ну и у буста есть встроенные генераторы случайных чисел с различным распределением. Последнее время я его использую.
Вот здесь пункт Г (
http://www.ipages.ru/index.php?ref_item_id=116&ref_dl=1) более подробно объясняется как генерировать нормальный закон используя цпт.
Что касается самого Пирсона, то суть его проста:
1. Разделить все пространство от минимума и до максимума на отрезки. Обычно используется формула 3,31ln n + 1. Где n-число элементов в выборке, но есть и другие формулы
http://ami.nstu.ru/~headrd/seminar/publik_html/Z_lab_8.htm2. Шаг второй - считаем количество элементов, которые попали в соответствующий интервал.
3. Шаг третий - смотрим разницу. Для этого суммируем по всем интервалам квадрат разницы между тем, сколько у нас попало элементов деленое на общее количество элементов и из дроби вычитаем вероятность попадания в интервал. Все это возводим в квадрат и делим на вероятность попадание в интервал. Полученную сумму умножаем на число элементов.
Вот эта вычисление
xiexp+=0.1*((fp[jf]-xip[ix]*r_count)*(fp[jf]-xip[ix]*r_count))/((xip[ix])*r_count);.
Только я не совсем понял, почему здесь 0.1. Да и вообще периодически проскакивает умножение на 10, которое мне не очень понятно.
Вот собственно и все.
Вот это:
float min=chi2inv(1-0.01,r_count-3);
float min25=chi2inv(1-0.25,r_count-3);
float mid=chi2inv(1-0.5,r_count-3);
float mid75=chi2inv(1-0.75,r_count-3);
float max=chi2inv(1-0.999,r_count-3);
смотрит значение критерия пирсона при различном уровне значимости. Дальше глядим в таблицы и принимаем решение о принятие нулевой гипотезы (полученное распределение совпадает с предполагаемым) или отвергаем эту гипотезу (это нефига не наше распределение).
P.S. Я бы выбросил эту прогу и переписал бы. Мух отдельно, котлеты отдельно. Да и магических чисел хватает.