Один из возможных методов состоит в выполнении последовательности проверок, которые позволяли бы определить, в какой интервал попадает число. Этот метод легко программируется, но программа получается длинной и медленной.
Самый быстрый метод заключается в определении целой переменной J, соответствующей номеру интервала, к которому относится число. Например, для интервала [0,1], разделенного на 20 классов длиной 0.05, можно получить значение J следующим образом:
J= целое (20 х) +1
х=0.03®целое(0.6)+1
х=0.06®целое(1.2)+2
Чтобы подсчитать число элементов в каждом классе, можно действовать следующим образом:
1) получить случайное число х,
2) вычислить J,
3) установить T(J)=T(J)+1, где Т – массив из р элементов и каждый элемент T(J) служит счетчиком для класса J.
Программа
uses Crt;
Var
a,b,p,n,i,j: integer;
Var
t: array [1..20] of integer;
Var
h1,x:Real;
Var
rp,y:Real;
Var
aa: array [1..72] of string[1];
Var
k: integer;
Begin
clrscr;
randomize;
{ writeln('a=0,b=20');
readln(a,b);
writeln('p=20');
readln(p);
writeln('n=10000');
readln(n);}
a:=0;b:=20;p:=20;n:=10000;
for i:=1 to p do t[i]:=0;
h1:=p/(b-a);
for i:=1 to n do
begin
x:=random(b);
j:=trunc((x-a)*h1)+1;
t[j]:=t[j]+1
end;
clrscr;
for i:=1 to p do
writeln(i:3,t[i]:10);
readln;
rp:=p;
for i:=1 to p do t[i]:=0;
for i:=1 to n do
begin
y:=random;
j:=trunc(rp*y)+1;
t[j]:=t[j]+1;
end;
Clrscr;
Writeln('*******');
for i:=1 to p do writeln(i:3,t[i]:10);
readln;
Clrscr;
writeln('Histogram');
for i:=1 to 72 do aa[i]:='*';
for i:=1 to p do
begin
k:=trunc((t[i]+5)/10);
write(i:2,t[i]:4,' ');
{writeln ('k=',k:3);}
for j:=1 to k do write(aa[j]);writeln;
end;
readln
end.