Задача: Разыграть 200 случайных величин XI^2 распределения с параметром n =10(число степеней свободы)
Внешний вид программы:
Реализация:
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]);
Комментарии к исходному коду:
1. Для начала введём гамма функцию (для моделирования распределения)
2. В теле программы идёт просчёт каждой случайной величины, согласно формуле (через г. ф.)
3. Далее необходимый интервал(от 0 до беск.) делится на единичные интервалы((0,1) (1,2) ..., (19,20))
4. Осуществляется проверка на принадлежность случайной величины к одному из данных интервалов
5. Непосредственно построение гистограммы (при наличии количества величин на каждый из интервалов)
6. Выведение гистограммы на график (chart1)