Random - генератор случайных чисел | Язык Паскаль
Pascal. Основы программирования Сложные Средние Простые задачи

Функция 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