close

Вход

Забыли?

вход по аккаунту

?

Отчет 1 лаба

код для вставкиСкачать
Московский Энергетический Институт (Технический Университет)
Лабораторная работа №1
"МОДЕЛИРОВАНИЕ ГЕНЕРАТОРОВ СЛУЧАЙНЫХ ЧИСЕЛ"
Вариант №10
Выполнил: студент группы А-8-11
Тинякова Д.А.
Москва 2013 г.
1 часть
Задание:
Построить генератор случайных чисел с равномерным законом распределения на интервале [0,1) по методу мультипликативного датчика. Получить выборку неповторяющихся псевдослучайных чисел объемом не меньше 10 000. Определить период генератора случайных чисел. Если он меньше 6000, то продолжить работу программы с новыми исходными данными. Провести анализ последовательности случайных чисел по критерию Пирсона. ВАРИАНТ № 10
№Метод для генератора случайных чисел с равномерным распределением на интервале [0,1)Метод для генератора случайных чисел с заданным распределением на интервале [a, d)Вариант функции плотности распреде- ления
a
b
c
d8Мультипликат. датчикИсключения 41236
Решение:
Параметры датчика:
a = 181;
b = 193;
M = 69857;
xi = 9586;
Полученный период: T=17464;
Проанализируем полученную последовательность:
Вероятность того, что данное распределение равномерно на [0,1), составляет 86%.
Для второго датчика (будет использоваться для 2 задания):
a = 256;
b = 221;
M = 75013;
x = 117;
Полученный период: T= 18754;
Вероятность: 84%
Текст программы:
#include <iostream>
#include <fstream>
#include <iomanip>
using namespace std;
int a, b, M;
int xi, x0;
int Fun(int X)
{
X = (a * X + b) % M;
return X;
}
int main()
{
int T;
setlocale(LC_ALL,"Russian");
ofstream out("Text.txt");
a = 181;
b = 193;
M = 69857;
xi = 9586;
x0 = xi;
int Mass[50];
for (int i = 0 ; i < 50 ; i++) Mass[i] = 0;
int Nom;
double Gran, ui;
int y = 0;
Nom = 0;
Gran = 0.02;
T = 1;
int k = 1;
ui = xi / M;
if (ui <= Gran) Mass[Nom]++;
else
{
while (ui > Gran)
{
Gran += 0.02;
Nom++;
}
if (ui <= Gran) Mass[Nom]++;
}
while (k != 17464)
{
xi = Fun(xi);
if (xi != x0) T++; ui = ((double) xi) / ((double) M);
Nom = 0;
Gran = 0.02;
if (ui <= Gran) Mass[Nom]++;
else
{
while (ui > Gran)
{
Gran += 0.02;
Nom++;
}
if (ui <= Gran) Mass[Nom]++;
}
k++;
}
for (int j = 0 ; j < 50 ; j++) {
cout << setw(2) <<j << ") " << Mass[j] << endl;
out << Mass[j] << endl;
}
out.close();
int X2 = 9586;
int T0 = 1;
for (int i = 0 ; i < 20000 ; i++)
{
X2 = Fun(X2);
if (X2 != x0) T0++; else {
cout << "T = " << T0 << " ; " << endl;
break;
}
}
system("PAUSE");
return 0;
}
2 часть
Задание:
Построить генератор случайных чисел с заданным законом распределения по методу обратной функции или исключения в соответствии с заданием. Получить выборку псевдослучайных чисел. Проанализировать выборку по критерию Пирсона.
№Метод для генератора случайных чисел с равномерным распределением на интервале [0,1)Метод для генератора случайных чисел с заданным распределением на интервале [a, d)Вариант функции плотности распреде- ления
a
b
c
d8Мультипликат. датчикИсключения 41236
Решение:
Используем генераторы из предыдущего задания. Известно, что площадь под кривой распределения равна единице, поэтому зная a b c d вычислим h из уравнения:
(h/2+h/4)*(b-a)+h/2*(c-b)+3h=1
Отсюда h=0.235
Всего было сгенерировано 17464 чисел, из них в фигуру попало 14858. Отсюда согласно геометрическим вероятностям в область S1 попадет 2619 чисел, в S2 - 1746, в S3 - 10493.
Используя функцию ХИ2ТЕСТ, находим вероятность того, что генератор создаёт случайные числа с заданным законом распределения. Р=81%.
Текст программы:
program Project2;
{$APPTYPE CONSOLE}
uses
SysUtils;
var
xi1,xi2,M1,M2,i: LongInt;
a1,a2,b1,b2,DNumb,T,K: Integer;
S: array [1..50] of Integer;
Right,x,y, h: Real;
FOut:Text;
ar, br, dr, cr: Integer;
function rrschX:Real;
begin
xi1:=(a1*xi1+b1) mod M1;
rrschX:=xi1/M1
end;
function rrschY:Real;
begin
xi2:=(a2*xi2+b2) mod M2;
rrschY:=xi2/M2
end;
begin
AssignFile(FOut,'Output.txt');
M1:=69857;
a1:=181;
b1:=193;
xi1:=9586;
M2:=75013;
a2:=256;
b2:=221;
xi2:=117;
T:=17464;
ar:=1; br:=2; cr:=3; dr:=6;
h:=0.235;
K:=0;
for i:=1 to T do
begin x:=ar+(dr-ar)*rrschX;
y:=h*rrschY;
if ((x>=ar) and (x<=br) and (y<=(-0.1175)*x+0.3525) or
((x>br) and (x<=cr) and (y<=h/2)) or
((x>cr) and (x<=dr)and (y<=h)))
then
begin
Inc(K);
Right:=0.1;
DNumb:=1;
if x<(ar+Right) then
Inc(S[DNumb])
else
while x>(ar+Right) do
begin
Inc(DNumb);
Right:=Right+0.1;
if x<(ar+Right) then
Inc(S[DNumb])
end;
end;
end;
for i:=1 to 50 do
Writeln(i,')= ', S[i]);
Writeln;
Writeln('kol-vo chisel= ',K);
Rewrite(FOut);
for i:=1 to 50 do
Writeln(FOut{Output},S[i]);
CloseFile(FOut); Readln;
end.
Вывод: полученные значения удовлетворяют условиям задачи, задание выполнено.
Документ
Категория
Рефераты
Просмотров
17
Размер файла
70 Кб
Теги
лаба, отчет
1/--страниц
Пожаловаться на содержимое документа