Вопрос № 181425: Здравствуйте, уважаемые эксперты! Прошу Вас ответить на следующий вопрос: код программы почти остается тот же см. этот вопрос Задание: Вопрос № 181425:
Здравствуйте, уважаемые эксперты! Прошу Вас ответить на следующий вопрос: код программы почти остается тот же см. этот вопрос Задание: Задание Тема: Моделирование законов распределения случайных чисел. Моделирование одноканальной СМО с неограниченной очередью
Отвечает Сергей Бендер (Практикант) :
Здравствуйте, novij2011!
Ещё раз извиняюсь -- конец семестра, должники идут косяком. Так что без комментариев в тексте программы. Чуть-чуть примечаний: 1)Пора уже сделать то, что надо было с самого начала: генерирование случайных чисел вынести в функции. Не по нажатию кнопки, а при каждом обращении к функции. Кроме того, нет никакой нужды количество суммируемых чисел выносить на пользовательский интерфейс – это внутреннее дело программы. (Кстати, в заготовке ошибка: в ch считывается 12, суммирование-то
делается «for it := 1 to 10 do»). 2)Один общий совет: никогда не делайте глобальную переменную индексом цикла for; в самой процедуре надо делать «var it:integer;» 3)Слишком много randomize делать не надо. На всю работу программы достаточно одного раза.
function GetR:real; var R:real; begin R:=random; GetR:=xsr+deltax*(2*R-1) end;
function GetNorm:real; var R:real; it:integer; begin R:=0; for
it := 1 to nnorm do R:=R+Random; GetNorm:=(sqrt(12/nnorm))*(R-nnorm/2)*bx+mx; end;
procedure TForm1.Button2Click(Sender: TObject); begin mx:=strtoint(Edit1.Text); bx:=strtoint(Edit2.Text); xsr:=Strtoint(Edit6.Text); deltax:=strtoint(edit7.Text); Tk:=Strtofloat(Edit8.Text); T := 0; Tzvezda := 0; Tfree:=0; STfree:=0; chas:=0; K := 0; maxK:=0; n := 0; // обслужено m := 0; // отказано Pbo:=0; i:=0; io:=0; Randomize;
tz :=GetR; bTz:=T+tz; while T < Tk do begin if Tzvezda > bTz then begin T := bTz; K := K+1; if K>maxK then maxK:=K; {if p+1 >= k then begin} n := n+1; {end else begin m := m+1; k := k-1; end;} if K = 1 then begin tobsl := GetNorm; Tzvezda := bTz+tobsl; Pbo:=Pbo+1; STfree:=STfree + (T-Tfree); end else
begin Tin[i] := T; i := i+1; end; if K > 0 then begin tobsl := GetNorm; Tzvezda := bTz+tobsl; end; tz :=GetR; bTz := bTz+tz; end else begin T := Tzvezda; if K > 0 then begin K := K-1; end; if K = 0 then begin Tzvezda := Tk; Tfree:=0; end else begin Tout[io]:=T; i
o:=io+1; tobsl := GetNorm; Tzvezda := T+Tobsl; end; end;
if T - chas*60 > 60 then begin
chas:=chas+1; StringGrid1.Cells[chas,2]:=inttostr(K); StringGrid1.Cells[chas,3]:=inttostr(maxK); StringGrid1.Cells[chas,4]:=floattostrf(STfree,ffFixed,5,3); StringGrid1.Cells[chas,5]:=floattostrf(Pbo/(Pbo+io),ffFixed,5,3); end; end; //вычисление характеристик n:=n-K; Toc:=0; for i:= 0 to io-1 do begin Toc:=Toc+Tout[i]-Tin[i]; end; Toc:=Toc/io;// клиентов прибыло //вероятность того, что в системе нет запросов Edit3.Text:=floattostr(STfree/Tk); //максимальное
число запросов в очереди Edit4.Text:=inttostr(maxK); //Edit6.Text:= // вероятность что будет обслужена без очереди Pbo := Pbo/(Pbo+io); Edit9.Text:=floattostr(Pbo); // время ожидания Edit10.Text:=floattostr(Toc); end; procedure TForm1.FormCreate(Sender: TObject); begin StringGrid1.ColCount:=11; StringGrid1.Cells[1,0]:='1 час'; StringGrid1.Cells[2,0]:='2 час'; Str
ingGrid1.Cells[3,0]:='3 час'; StringGrid1.Cells[4,0]:='4 час'; StringGrid1.Cells[5,0]:='5 час'; StringGrid1.Cells[6,0]:='6 час'; StringGrid1.Cells[7,0]:='7 час'; StringGrid1.Cells[8,0]:='8 час'; StringGrid1.Cells[9,0]:='9 час'; StringGrid1.Cells[10,0]:='10 час';
StringGrid1.RowCount:=8; StringGrid1.Cells[0,0]:='характеристика'; StringGrid1.Cells[0,1]:='приш.заявки';
StringGrid1.Cells[0,2]:='длина очереди'; StringGrid1.Cells[0,3]:='max длина очерели'; StringGrid1.Cells[0,4]:='t простоя'; StringGrid1.Cells[0,5]:='P(простоя нет запросов)'; StringGrid1.Cells[0,6]:='cр время ожидания'; StringGrid1.Cells[0,7]:='вер-ть не ждет обслуж-я'; end;
end.
Ответ отправил: Сергей Бендер (Практикант)
Ответ отправлен: 23.12.2010, 00:39
Номер ответа: 265019
Оценка ответа: 5 Комментарий к оценке: спасибочки
Вам помог ответ? Пожалуйста, поблагодарите эксперта за это! Как сказать этому эксперту "спасибо"?
Отправить SMS#thank 265019
на номер 1151 (Россия) |
Еще номера »
Оценить выпуск »
Нам очень важно Ваше мнение об этом выпуске рассылки!
* Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи.
(полный список тарифов)
** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
*** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.