Кодинг
★ Рубрика: Кодинг
★ Тема: Pascal

Генератор случайных чисел в Паскале

В Паскале, для генерации случайных чисел используются следующие процедуры: 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.
 Похожие публикации: Pascal

Войти и комментировать [ Вход | Регистрация ]