const nkmax=20; {максимально возможное количество каналов в программе}
var i,Mi,n,m:integer;
Tz,Tpr,Tobsl:array[1..nchmax] of real;
T,Tk,T0,STpr,Landa,Trazg,R:real;
begin
Landa:=strtofloat(edit1.Text);
Mi:=strtofloat(Edit2.Text);
Tk:=strtofloat(Edit3.Text);
{ Tiz:=0; ttpri:=0 }
for i:=1 to Mi do
begin
Tz[i]:=0;
Tpr[i]:=0;
Tobsl[i]:=0;
end;
STpr:=0;
T := 0;
n := 0;
m := 0;
randomize; {делается только одн раз в начале работы программы}
while Tk > T do
begin
{Здесь у тебя, очевидно, выражение, обратное к функции
показательного распределения. Это значит R -- это вероятность
и должно быть случайным в интервале (0;1) }
R:=random;
T0 := -(1/landa)*ln(R);
T := T+T0; {Сомнительно, чтобы тут надо было прибавлять Tz,
т.к. это массив. Строкой выше было вычислена T0 -- его и надо
прибавлять.}
{Каскад if'ов реализуется в виде цикла
для поиска первого Tz[i], который меньше чем T}
i:=1;
while (i<=Mi) and (Tz[i]>T) do
i:=i+1;
if i>Mi {T оказалось меньше всех Tz[i]}
then m:=m+1
else begin {иначе, т.е. нашлось i, что Tz[i]<T}
{альфа для i-го канала;}
Tpr[i] := T-Tz[i];
STpr := STpr+Tpr[i];
R:=random;
T0:=-(1/Mi)*ln(R);
Tobsl[i]:=Tobsl[i]+T0; {Так будет правильнее, по-моему}
Tz[i] := T+T0;
n := n+1;
end;
end;
Edit4.Text:= FloatToStr(m/(m+n)); {вероятность отказа в обслуживании}
Edit5.Text:= IntToStr(m+n); {сколько звонков поступило}
Edit6.Text:= FloatToStr(STpr); {свободных(неиспользованных) минут}
{Ниже: i-ый канал использовался...
Количество использованных каналов в программе нефиксированно, значит
нельзя записывать просто в Edit. Можно использовать Memo, хотя есть
более правильные способы вывода данных}
Memo1.Clear;
for i:=1 to Mi do
Memo1.Lines.Add(FloatToStr(Tobsl[i]));
end;
const nchmax=20; {максимально возможное количество каналов в программе}
var i,n,m,nch:integer;
Tz,Tpr,Tobsl:array[1..nchmax] of real;
T,Tk,T0,STpr,Landa,Trazg,Mi,R:real;
begin
Landa:=strtofloat(edit1.Text)/60;
Trazg:=strtofloat(Edit2.Text);
Mi:=1/Trazg;
Tk:=strtofloat(Edit3.Text);
nch:=strtoint(Edit7.Text);
{ Tiz:=0; ttpri:=0 }
for i:=1 to nch do
begin
Tz[i]:=0;
Tpr[i]:=0;
Tobsl[i]:=0;
end;
STpr:=0;
T := 0;
n := 0;
m := 0;
randomize; {делается только одн раз в начале работы программы}
while Tk > T do
begin
{Здесь у тебя, очевидно, выражение, обратное к функции
показательного распределения. Это значит R -- это вероятность
и должно быть случайным в интервале (0;1) }
R:=random;
T0 := -(1/landa)*ln(R);
T := T+T0; {Сомнительно, чтобы тут надо было прибавлять Tz,
т.к. это массив. Строкой выше было вычислена T0 -- его и надо
прибавлять.}
{Каскад if'ов реализуется в виде цикла
перебирающего Tz[i], пока не найдёт меньший чем T}
i:=1;
while (i<=nch) and (Tz[i]>T) do
i:=i+1;
if i>nch {если T оказалось меньше всех Tz[i]}
then m:=m+1
else begin {иначе, т.е. нашлось i, что Tz[i]<T}
{альфа для i-го канала;}
Tpr[i] := T-Tz[i];
STpr := STpr+Tpr[i];
R:=random;
T0:=-(1/Mi)*ln(R);
Tobsl[i]:=Tobsl[i]+T0; {Так будет правильнее, по-моему}
Tz[i] := T+T0;
n := n+1;
end;
end;
Edit4.Text:= FloatToStr(m/(m+n)); {вероятность отказа в обслуживании}
Edit5.Text:= IntToStr(m+n); {сколько звонков поступило}
Edit6.Text:= FloatToStr(STpr); {свободных(неиспользованных) минут}
{Ниже: i-ый канал использовался...
Количество использованных каналов в программе нефиксированно, значит
нельзя записывать просто в Edit. Можно использовать Memo, хотя есть
более правильные способы вывода данных}
Memo1.Clear;
for i:=1 to nch do
Memo1.Lines.Add(FloatToStr(Tobsl[i]));
end;
Если Вы уже зарегистрированы на Портале - войдите в систему, если Вы еще не регистрировались - пройдите простую процедуру регистрации.