Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Массив указателей



Создание «разреженного массива» в виде массива указателей покажем на примере решения конкретной задачи. Рассматривается задача моделирования непрерывной случайной величины ξ с распределением вероятности: ρ(x) = 1/x2 на интервале (1, ∞). Методом обратных функций получаем формулу для розыгрыша случайной величины ξ = 1/random. Для визуализации результатов моделирования получаемых значений случайной величины ξ по умолчанию выбирается шаг группировки равный 0.1, это значит, что все значения случайной величины, отличающиеся друг от друга меньше, чем на 0.1, заносятся в одну ячейку гистограммы. Интерфейс программы показан на рис. 6.

Run
Edit1
Label3
Label2
Label6

Рис. 6. Интерфейс программы моделирования случайной величины

На рисунке показан результат выполнения программы. При увеличении статистики разница между требуемым количеством ячеек гистограммы и количеством ячеек, которые используются в «разреженном массиве» («количество точек на графике»), еще более разительна.

Создадим класс для того, чтобы для каждой уникальной точки хранить значения индекса и количество точек, попавших в этот индекс.

type

TOne= class (TObject)

Find:integer;

Fvalue:integer;

Constructor Create(Fi,Fv:integer);

end;

Что здесь имеется в виду под индексом Find?Пусть есть интервал от a до b.

 
 


Рис. 7. Индекс точки

Чтобы узнать, в какой интервал попадает случайная точка a ≤ d ≤ b, необходимо вычислить (d – a) / sh. Для распределения, выбранного для этого примера, интервал начинается с 1, поэтому индекс гистограммы равен trunc ((ξ -1)/sh). Описание глобальных переменных и конструктор класса Tone:

var

Form1: TForm1;

MyList:TList; // Объявление объектной переменной, списка //указателей

flag:boolean; // Флажок

stat:integer; // Статистика (берется из Edit1)

sh,ma:single; // sh - Шаг гистограммы (берется из Edit2)

// ma – максимальное значение случ. в-ны ξ

Constructor TOne.Create(Fi,Fv:integer);

begin

inherited Create;

FInd:=Fi; FValue:=Fv;

end;

Обработчик события OnCreate формы Form1:

procedure TForm1.FormCreate(Sender: TObject);

begin

MyList:=TList.Create; // создание списка указателей

Label2.Visible:=false; Label3.Visible:=false; Label6.Visible:=false;

end;

Обработчик события нажатие кнопки Run («Расчет»):

procedure TForm1.RunClick(Sender: TObject);

var Temp:TOne; //Переменная,чтобы использовать свойства класса TOne

d,t:single;

i,j,indArr:integer;

begin

Label2.Visible:=false; Label3.Visible:=false; Label6.Visible:=false;

MyList.Clear; // очистка списка

stat:=StrToInt(Edit1.Text); sh:=StrToFloat(Edit2.Text);

ma:=1; // нач. значение для поиска максимума

Randomize;

for i:=1 to stat do begin // очень большая статистика не нужна

t:=random;

if not (t=0) then d:=1/t else d:=1;

indArr:=trunc((d-1)/sh); // индекс

if d>ma then ma:=d; // максимальное значение случ. величины

if MyList.Count=0 then // если список пуст

MyList.Add(TOne.Create(indArr,1)) //добавить в список

else begin // не пустой список

flag:=false;

for j:=0 to MyList.Count-1 do begin // цикл по всему //списку, есть ли точка с инд indArr

Temp:=MyList.Items[j]; // указатель из MyList на Temp

if Temp.Find=IndArr then begin // indArr совпал

inc(Temp.Fvalue); // добавить к-во точек

flag:=true; // флаг - искали индекс и нашли

break;

end; // совпали

end; // цикл по всему списку

if flag=false then // индекс не нашли,пришло новое значение

MyList.Add(TOne.Create(IndArr,1)); //добавить в список end; // не пустой список

end; // цикл по статистике

Label2.Visible:=true; Label2.Caption:='Расчет закончен';

end;

Обработчик события нажатие кнопки Show («График»):

procedure TForm1.ShowClick(Sender: TObject);

var i:integer;

Temp:TOne;

x,y,y1:single;

begin

Chart1.Series[0].Clear; Chart1.Series[1].Clear;

if MyList.Count>0 then begin

Label2.Visible:=true;

Label2.Caption:='Количество точек на графике ='+ IntToStr(MyList.Count);

for i:=0 to MyList.Count-1 do begin // просмотреть весь список

Temp:=MyList.Items[i]; // очередной элемент списка

x:=Temp.Find*Sh+1;

y:=Temp.Fvalue/stat/sh; // моделируемое значение в точке x

y1:=1/(x*x); // аналитическое значение функции в точке x

Chart1.Series[0].AddXY(x,y,'',clTeeColor);

Chart1.Series[1].AddXY(x,y1,'',clTeeColor);

end;

Label3.Visible:=true;

Label3.Caption:='Требуемое число ячеек гистограммы = '+

IntToStr(Trunc((ma-1)/sh)+1);

Label6.Visible:=true;

Label6.Caption:='Максимальное значение случайной величины ='+

FloatToStrF(ma,ffFixed,6,3);

end; end;

Обработчик события OnClose формы Form1:

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

begin

MyList.Free; // освободить память, отведенную для списка

Chart1.Series[0].Clear; // освободить память, отведенную под серию

Chart1.Series[1].Clear;

end;





Дата публикования: 2014-11-03; Прочитано: 301 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.01 с)...