Задача: Разыграть 200 случайных величин XI^2 распределения с параметром n =10(число степеней свободы)


Внешний вид программы:

http://s5.uploads.ru/t/ej9K1.png


Реализация:

Код:
public int GammaFunc(int k)
        {
            int result = 1;
            for (int i=1;i<=k-1;i++)
            {
                result *= i;
            }
            return result;
        }
        private void button1_Click(object sender, EventArgs e)
        {
            int[] n = new int[20];
            int m = 10;
            Random r = new Random();
            int count = 200;
            double[] teta = new double[count];
            double proizvedenie=1;
            for (int i=0;i<count;i++)
            {
                for (int j=0;j<m*0.5;j++)
                {
                    if (j==0) {proizvedenie = r.NextDouble();}
                    proizvedenie*=r.NextDouble();
                }
                teta[i] = -2 * Math.Log(proizvedenie,Math.E);
                richTextBox1.Text += Convert.ToString(teta[i]) + "\n";
                
            }
            double[] plotnost_chi_square = new double[count];
            for (int i=0;i<count;i++)
            {
                plotnost_chi_square[i] = Math.Pow((0.5), 0.5 * m) / GammaFunc(m/2) * Math.Pow(teta[i], 4) * Math.Pow(Math.E, -teta[i] * 0.5);
                richTextBox2.Text += Convert.ToString(plotnost_chi_square[i]) + "\n";
                chart1.Series[0].Points.AddXY(teta[i], plotnost_chi_square[i]);
            }
            for (int i=0;i<count;i++)
            {
                if (teta[i] > 0 && teta[i] < 1) n[0]++;
                if (teta[i] > 1 && teta[i] < 2) n[1]++;
                if (teta[i] > 2 && teta[i] < 3) n[2]++;
                if (teta[i] > 3 && teta[i] < 4) n[3]++;
                if (teta[i] > 4 && teta[i] < 5) n[4]++;

                if (teta[i] > 5 && teta[i] < 6) n[5]++;
                if (teta[i] > 6 && teta[i] < 7) n[6]++;
                if (teta[i] > 7 && teta[i] < 8) n[7]++;
                if (teta[i] > 8 && teta[i] < 9) n[8]++;
                if (teta[i] > 9 && teta[i] < 10) n[9]++;

                if (teta[i] > 10 && teta[i] < 11) n[10]++;
                if (teta[i] > 11 && teta[i] < 12) n[11]++;
                if (teta[i] > 12 && teta[i] < 13) n[12]++;
                if (teta[i] > 13 && teta[i] < 14) n[13]++;
                if (teta[i] > 14 && teta[i] < 15) n[14]++;

                if (teta[i] > 15 && teta[i] < 16) n[15]++;
                if (teta[i] > 16 && teta[i] < 17) n[16]++;
                if (teta[i] > 17 && teta[i] < 18) n[17]++;
                if (teta[i] > 18 && teta[i] < 19) n[18]++;
                if (teta[i] > 19 && teta[i] < 20) n[19]++;
            }
            chart2.Series[0].Points.AddXY(1, n[0]);
            chart2.Series[0].Points.AddXY(2, n[1]);
            chart2.Series[0].Points.AddXY(3, n[2]);
            chart2.Series[0].Points.AddXY(4, n[3]);
            chart2.Series[0].Points.AddXY(5, n[4]);

            chart2.Series[0].Points.AddXY(6, n[5]);
            chart2.Series[0].Points.AddXY(7, n[6]);
            chart2.Series[0].Points.AddXY(8, n[7]);
            chart2.Series[0].Points.AddXY(9, n[8]);
            chart2.Series[0].Points.AddXY(10, n[9]);

            chart2.Series[0].Points.AddXY(11, n[10]);
            chart2.Series[0].Points.AddXY(12, n[11]);
            chart2.Series[0].Points.AddXY(13, n[12]);
            chart2.Series[0].Points.AddXY(14, n[13]);
            chart2.Series[0].Points.AddXY(15, n[14]);

            chart2.Series[0].Points.AddXY(16, n[15]);
            chart2.Series[0].Points.AddXY(17, n[16]);
            chart2.Series[0].Points.AddXY(18, n[17]);
            chart2.Series[0].Points.AddXY(19, n[18]);
            chart2.Series[0].Points.AddXY(20, n[19]);

Демонстрация работы:
http://s4.uploads.ru/t/CMQ6R.png


Комментарии к исходному коду:
1. Для начала введём гамма функцию (для моделирования распределения)
2. В теле программы идёт просчёт каждой случайной величины, согласно формуле (через г. ф.)
3. Далее необходимый интервал(от 0 до беск.) делится на единичные интервалы((0,1) (1,2) ..., (19,20))
4. Осуществляется проверка на принадлежность случайной величины к одному из данных интервалов
5. Непосредственно построение гистограммы (при наличии количества величин на каждый из интервалов)
6. Выведение гистограммы на график (chart1)