Функция random — генератор случайных чисел в Pascal
Бывают ситуации, когда требуется, чтобы результат работы программы был случайным в определенных пределах. Для реализации такой возможности во многих языках программирования присутствуют встроенные функции, код которых выдает случайные числа. На самом деле числа не совсем случайные, а псевдослучайные. Дело в том, что искусственно реализовать случайность невозможно. Обычно берется некоторый коэффициент и с его помощью вычисляется каждое последующее "случайное" число.
В языке программирования 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