Сборник задач и упражнений по курсу "Моделирование" (Мультипликативный конгруэнтный генератор с простым модулем), страница 4

s=s+(x[i]+m)^2*1/N

 
Овал: КонецПараллелограмм: m, s, TРомб: i<=N

i=i+1

 

sum=sum+x[i]

 

T=i-1

flag=true

 

Рис.1.2. Процедура Raspredelenie


Рис.1.3. Функция Chislo

Результат

Рис.1.4. Окно настройки параметров генератора

Рис.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);