Функция random - генератор псевдослучайных чисел
Бывают ситуации, когда требуется, чтобы результат работы программы был случайным в определенных пределах. Для реализации такой возможности во многих языках программирования присутствуют встроенные функции, код которых выдает случайные числа. На самом деле числа не совсем случайные, а псевдослучайные. Дело в том, что искусственно реализовать случайность невозможно. Обычно берется некоторый коэффициент и с его помощью вычисляется каждое последующее "случайное" число.
В языке программирования Pascal для генерации псевдослучайных чисел в заданных диапазонах используется функция random.
Перед ее использованием обычно выполняется процедура инициализации датчика случайных чисел - randomize; иначе программа всегда будет выдавать один и тот же результат. Randomize задает начальное значение последовательности, от которого вычисляются все последующие. При каждом запуске программы это значение будет разным, а значит и результат работы функции random будет различным.
Вызов функции random()
без аргументов возвращает вещественное случайное число в диапазоне от нуля (включительно) до единицы, то есть [0, 1).
var
a, b: real;
begin
randomize;
a := random();
writeln(a:6:4);
b := random();
writeln(b:4:2);
end.
Пример выполнения:
0.5023
0.15
Если в скобках функции random()
указан параметр, то она возвращает целое число от 0 до указанного в скобках (не включая само значение). Так выражение random(10)
говорит о том, что будет получено любое число в диапазоне [0, 10).
var
a, b: integer;
begin
randomize;
a := random(10);
writeln(a);
b := random(-20);
writeln(b);
end.
Пример выполнения:
7
-14
Если требуется получать значения в каком-либо другом диапазоне (не от нуля), то прибегают к математической хитрости. Например, чтобы получить случайное число от -100 до 100 достаточно записать такое выражение: random(200) - 100
. В результате его выполнения сначала будет получено число из диапазона [0, 199], а затем из него будет вычтена сотня. И если случайное число было меньше 100, то результат выражения будет отрицательным.
В программе ниже сначала с помощью процедуры randomize
инициализируется датчик случайных чисел. Далее переменной n присваивается случайное значение в диапазоне [5, 12). Значение n используется для определения количества повторов цикла for. В цикле for генерируются случайные числа в диапазоне [-50, 49) и выводятся на экран.
var
n, i, x: integer;
begin
randomize;
n := random(7) + 5;
for i := 1 to n do begin
x := random(100) - 50;
write(' ', x)
end;
writeln;
end.
Пример выполнения:
0 38 23 -34 -13 -42 47
Рассмотрим более сложную задачу. Допустим, надо сгенерировать случайное целое число в пределах диапазона, границы которого вводит пользователь с клавиатуры. Аналогичным образом требуется получить случайное вещественное число и случайный символ. Введем переменные:
- min_i, max_i - минимальная и максимальная границы диапазона для целого числа;
- n_i - случайное целое число;
- min_f, max_f - минимальная и максимальная границы диапазона для вещественного числа;
- n_f - случайное вещественное число;
- first_c, last_c - первый и последний символ диапазона, в котором должен быть сгенерирован случайный символ;
- min_c, max_c - коды-числа, соответствующие указанным символам;
- n_c - случайное число, которое будет переведено в символ по таблице ASCII.
Программа на языке Паскаль:
var
min_i, max_i, n_i: integer;
min_f, max_f, n_f: real;
first_c, last_c: char;
min_c, max_c, n_c: byte;
begin
randomize;
write('Minimum integer: ');
readln(min_i);
write('Maximum integer: ');
readln(max_i);
n_i := random(max_i-min_i+1) + min_i;
writeln(n_i);
write('Minimum float: ');
readln(min_f);
write('Maximum float: ');
readln(max_f);
n_f := random() * (max_f-min_f) + min_f;
writeln(n_f:5:2);
write('First char: ');
readln(first_c);
write('Last char: ');
readln(last_c);
min_c := ord(first_c);
max_c := ord(last_c);
n_c := random(max_c-min_c+1) + min_c;
writeln(chr(n_c));
end.
Пример выполнения программы:
Minimum integer: -100
Maximum integer: 100
-46
Minimum float: 0.23
Maximum float: 0.85
0.53
First char: k
Last char: q
p