|
|
|
|
Рис.1.2. Процедура Raspredelenie
Рис.1.3. Функция Chislo
Результат
Рис.1.5. Окно просмотра псевдослучайных чисел
Рис. 1.5. Гистограмма
Задав начальные параметры z0=3, k=5, b=7, c=65536, получаем гистограмму распределения псевдослучайных чисел с математическим ожиданием 17.50005, дисперсией 52.08446 и периодом генератора 65536. При изменении параметров генератора в окне настройки параметров (рис.1.4) будет изменяться последовательность получаемых псевдослучайных чисел, при этом гистограмма распределения изменится незначительно.
Задание
Разработать процедуру, которая получает псевдослучайные числа по экспоненциальному закону распределения. Написать программу, которая получает псевдослучайные числа, построить гистограмму и вычислить период генератора псевдослучайных чисел.
Экспоненциальное распределение m=80
x=-m*ln(r), где r равномерно распределено в интервале от 0 до 1.
Входные данные:
k,b- простые числа;
z0- базовое число;
m- математическое ожидание;
c- период цикла.
Выходные данные:
x-псевдослучайное число
Программа
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, math;
Type
TForm1 = class(TForm)
Button1: TButton;
Chislom: TScrollBar;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Chisloc: TScrollBar;
Chislob: TScrollBar;
Chislok: TScrollBar;
Image1: TImage;
Chislos: TScrollBar;
Label7: TLabel;
Label9: TLabel;
Label6: TLabel;
Label8: TLabel;
Label10: TLabel;
procedure Button1Click(Sender: TObject);
procedure ChislocChange(Sender: TObject);
procedure ChislobChange(Sender: TObject);
procedure ChislokChange(Sender: TObject);
procedure ChislomChange(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure ChislosChange(Sender: TObject);
private
{ Private declarations }
function Slych():real;
procedure Raspredelenie(Sender:TObject);
function Conv1(A: Double; n: integer):Double;
public
{ Public declarations }
end;
var
Form1: TForm1;
c:integer=512;
k:integer=1;
b:integer=17;
z:integer;
s:string;
maxy1:integer;
m:real=80;
slych1:integer=9900;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
Raspredelenie(Sender);
end;
function TForm1.Slych():real;
var
i:integer;
r:real;
a:integer;
begin
a:=4*k+1;
z:=(a*z+b)mod c;
r:=z/c;
result:=-m*ln(1-r);
end;
procedure TForm1.Raspredelenie(Sender:TObject);
var
i,k1,x,y,j,y1:integer;
max,min:real;
x1:array [0..10001] of single;
a:bool;
begin
max:=0;
k1:=0;
z:=0;
min:=100;
a:=false;
for i:=0 to slych1 do
begin
x1[i]:=Slych();
if x1[i]>max then max:=x1[i];
if x1[i]<min then min:=x1[i];
if (i>0)and(a=false)and(x1[0]=x1[i]) then
begin
k1:=i;
a:=true;
end;
end;
x:=Image1.Width;
y:=Image1.Height;
Image1.Canvas.Rectangle(0,0,Image1.Width,Image1.Height);
s:=FloatToStr(k1);
Image1.Canvas.TextOut(round(Image1.Width/2),round(Image1.Height/5),'ïåðèîä=');
Image1.Canvas.TextOut(round(Image1.Width/2)+45,round(Image1.Height/5),s);
Image1.Canvas.Pen.Width:=3;
Image1.Canvas.MoveTo(36,0);
Image1.Canvas.LineTo(36,y-36);
Image1.Canvas.LineTo(x,y-36);
Image1.Canvas.Pen.Width:=1;
Image1.Canvas.Brush.Color:=RGB(255,255,255);
y1:=0;
min:=-0.001;
max:=1050;
for j:=0 to 9 do
begin
for i:=0 to slych1-1 do
if((x1[i]>min)and(x1[i]<=(min+(max+0.001)/10)))then y1:=y1+1;
if y1>maxy1 then maxy1:=y1;
Image1.Canvas.Brush.Color:=RGB(255-j*15,255-j*9,j*25);
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.