В Паскале, для генерации случайных чисел используются следующие процедуры:
Random– генерирует значение случайного числа из диапазона 0. . . 0.99. Тип результата – вещественный.
Пример.
for i:=1 to 3 write(Random:8:5);
Результат = 0.06919 0.78539 0.17197
Random(N)-генерирует значение случайного числа из диапазона 0… N
Чтобы случайные числа были "более случайными", необходимо периодиче-ски менять базу генерации. Для этого используется процедура Randomize.
Пример.
for i:=1 to 10
begin
write(Random(200):4);Randomize
end;
В некоторых случаях, встроенных генераторов случайных чисел бывает недостаточно. Тогда приходится писать собственные, в соответствии с требуемыми условиями.
Пример. Собственный генератор случайных чисел.
program Generator;
var s,i: integer;
function next(var ss:integer): integer;
const k1=37; k2=3; cycle=64;
begin
next:=ss;
ss:=(k1*ss+k2) mod cycle
end;
begin
s:=16;
for i:=1 to 64 do write(next(s):3);
end.
Если вызвать функцию с параметром s:=16; write(next(s)); получим число 16. Вместе с тем, возвращая 16, функция изменяет значение, хранящееся в переменной ss на 19. Если функцию вызвать снова, с полученным значением s то она возвращает число 19 и изменит значение s на 2. Продолжая вызывать функцию next получим определенную последовательность целых чисел, начинающегося с исходного значения s.
Замечательным свойством этой последовательности является то, что каждое число от 0 до 63 встречается в ней ровно один раз. Более того, шестьдесят пятый вызов функции next() дает число 16 и начнется новый цикл. Другими словами, начиная с любого желаемого целого, функция генерирует фиксированную перестановку чисел от 0 до 63.
Такой прием используется для генерации так называемых "псевдослучайных чисел". Цикл из 64 чисел, конечно очень мал. Можно, например организовать еще один набор "псевдослучайных чисел":
k1=25173, k2=13849, cycle=65536
В задачах моделирования, в играх и т.п. часто удобно использовать случайные дроби в интервале от 0 до 1, а не целые числа. Для получения дробей нужно немного изменить функцию и программу.
Пример. Случайные числа в диапазоне 0..1 с базой от 0 до 65536
program Rand;
var s,i: longint;
function rnd(var ss:longint): real;
const k1=25173; k2= 13849; cycle=65536;
begin
rnd:=ss/cycle;
ss:=(k1*ss+k2) mod cycle
end;
begin
s:=65536;
for i:=1 to 65536 do write(rnd(s):3);
end.