***************************************** **
6 498 ********************************************* *****
7528 ********************************************* ********
8 534 ********************************************* ********
9 476 ********************************************* ***
10 521 ********************************************* *******
11 503 ********************************************* ***** p> 12503 ********************************************* *****
13 491 ********************************************* ****
14 498 ********************************************* *****
15 451 *********************************************
16508 ********************************************* ******
17516 ********************************************* *******
18529 ********************************************* ********
19525 ********************************************* ********
20495 ********************************************* *****
В
Зауваження
Крім розглянутого тут тесту "по гістограмі" відомі і інші, більш досконалі статистичні тести для перевірки якості генератора випадкових чисел [*].
*) Кнут. мистецтво програмування. Т.2.
В
Пояснення до алгоритму
При складанні програми авторам [5, с. 103-107] належало подолати одне утруднення - визначити, до якого інтервалу відноситься одержуване випадкове число.
Один з можливих методів полягає в виконанні послідовності перевірок, які дозволяли б визначити, в який інтервал потрапляє число. Цей метод легко програмується, але програма виходить довгою і повільною.
Найшвидший метод полягає у визначенні цілої змінної 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.