Задача: Разыграть 500 сл. в. в соответствии с мат. ожиданием m=4 и ср. кв. откл. sigma = 1.


Внешний вид программы:
http://sg.uploads.ru/t/rlEMx.png


Реализация:

Код:
const int mu = 4; const int sigma = 1; const int count = 500; int[] c = new int[30];

        private void button1_Click(object sender, EventArgs e)
        {
            double[] x = new double[count];
            double[] phi = new double[count];
            double[] etta = new double[count];
            double h = 0.01, eps = 0.001;
            Random r = new Random();
            for (int i=0;i<count;i++)
            {
                phi[i] = r.NextDouble() - 0.5;
            }
            double sum = 0;
            int k = 1, stop = 0;
            for (int i = 0; i < count; i++)
            {
                sum = (h / Math.Sqrt(2 * 3.1428)) * Math.Exp(-0.5 * h * h);
            rep:
                if (Math.Abs(phi[i]) - sum > eps)
                {
                    sum += (Math.Abs(k * h - (k - 1) * h) / Math.Sqrt(2 * 3.1415)) * Math.Exp(-0.5 * k * h * k * h);
                    k++;
                    goto rep;
                }
                else
                {
                    if (phi[i] > 0)
                        etta[i] = sigma * k * h + mu;
                    else
                        etta[i] = -1 * sigma * k * h + mu;
                    k = 1;
                }
            }
            for (int i=0;i<count;i++)
            {
                richTextBox1.Text += Convert.ToString(etta[i]) + "\n";
            }
            for (int i = 0; i < count; i++)
            {
                for (int j = -15; j < 15; j++)
                {
                    if (etta[i] < j)
                    {
                        c[j + 15]++; //массив счетчиков попадания
                        break;
                    }
                }
            }
            for (int i = 0; i < c.Length; i++)
            {
                richTextBox2.Text += Convert.ToString(c[i]) + "\n";
            }
            for (int i=-15;i<15;i++)
            {
                chart1.Series[0].Points.AddXY(i, c[i+15]); 
            }

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


Комментарии к исходному коду:
1. Разыгрываем сл. в. с помощью класса Random и вычитаем 1/2
2. Составляем беск. сумму (считаем интеграл)
3. Приводим преобразования для нужных нам параметров распределения
4. Дробим интервал на несколько единичных (конечно, нужно взять побольше для показательной картины)
5. Строим гистограмму и выводим на chart1


2 способ:

Код:
const int mat_ozhid = 4; const int sigma = 1; const int count = 500; double[] ksi = new double[500]; int[] c = new int[30];
        private void button1_Click(object sender, EventArgs e)
        {
            double sum=0;
            Random r = new Random();
            for (int i=0;i<count;i++)
            {
                for (int j=1;j<=12;j++)
                {
                    sum+=r.NextDouble();
                }
                ksi[i] = sigma * (sum - 6) + mat_ozhid; richTextBox1.Text += Convert.ToString(ksi[i]) + "\n";
                sum = 0;
            }
            for (int i = 0; i < count; i++)
            {
                for (int j = -15; j < 15; j++)
                {
                    if (ksi[i] < j)
                    {
                        c[j + 15]++; //массив счетчиков попадания
                        break;
                    }
                }
            }
            for (int i = 0; i < c.Length; i++)
            {
                richTextBox2.Text += Convert.ToString(c[i]) + "\n";
            }
            for (int i = -15; i < 15; i++)
            {
                chart1.Series[0].Points.AddXY(i, c[i + 15]);
            }
        }

3 способ:

Код:
const int mat_ozhid = 4; const int sigma = 1; const int count = 500; int[] c = new int[20]; int count1 = 0; 
        double[] x = new double[count]; double[] etta = new double[count]; double etta1, g1, g2, ksi, help; double G = Math.Sqrt(Math.PI * 0.5);
        private void button1_Click(object sender, EventArgs e)
        {
            int n=0;
            Random r = new Random();
             for (int i=0;i<2*count;i++)
             {
                 g1 = r.NextDouble();
                 ksi = Math.Tan(Math.PI * (g1 - 0.5));
                 g2 = r.NextDouble();
                 etta1 = (g2 * G / Math.PI) * Math.Sin(Math.PI * g1) * Math.Sin(Math.PI * g1);
                 help = Math.Exp(-0.5 * ksi * ksi) / Math.Sqrt(2 * Math.PI);
                 if (etta1<=help)
                 {
                     count1++;
                     etta[n] = sigma * ksi + mat_ozhid;
                     n++;
                     if (count1 == 500)
                         goto end;
                 }
             }
            end:
             for (int i = 0; i < count; i++)
             {
                 for (int j = -12; j < 8; j++)
                 {
                     if (etta[i] < j)
                     {
                         c[j + 12]++; //массив счетчиков попадания
                         break;
                     }
                 }
             }
            for (int i=0;i<count;i++)
            {
                richTextBox1.Text += Convert.ToString(etta[i]) + "\n";
            }
            for (int i = 0; i < c.Length; i++)
            {
                richTextBox2.Text += Convert.ToString(c[i]) + "\n";
            }
            for (int i = -12; i < 8; i++)
            {
                chart1.Series[0].Points.AddXY(i, c[i + 12]);
            }