Случайные числа — random и randomize
program Dice;
var
i: integer;
begin
randomize;
for i := 1 to 5 do
write(random(6) + 1, ' ');
writeln;
end.Программа «бросает кубик» пять раз и при каждом запуске печатает новые пять чисел от 1 до 6, например 4 1 6 6 2.
random(n)— случайное целое от 0 до n − 1.random(6)даёт 0…5, поэтому для кубика прибавляют 1.randomбез скобок — случайное дробное число от 0 (включительно) до 1 (не включая 1).randomize— запускает генератор с нового места. Вызывают один раз, в начале программы.
Число от a до b
Формула для целого числа от a до b включительно:
x := a + random(b - a + 1);Например, от −10 до 10: x := -10 + random(21) — всего 21 возможное значение. От 10 до 99 (двузначное): x := 10 + random(90).
Дробное число от a до b: x := a + random * (b - a).
В PascalABC.NET есть ещё функция Random(a, b) — сразу целое от a до b включительно. В Free Pascal её нет, там используйте формулу выше.
Зачем randomize
Компьютер не бросает кости: «случайные» числа считаются по формуле от начального значения. В Free Pascal без randomize это значение одно и то же, и программа при каждом запуске выдаёт одинаковые числа. randomize берёт начальное значение от текущего времени, и числа каждый раз новые. В PascalABC.NET генератор и без randomize при каждом запуске начинает по-новому, но вызов ничему не мешает — пишите его, чтобы программа работала одинаково везде.
Одинаковые числа при каждом запуске бывают и полезны — при поиске ошибки. Тогда randomize временно закомментируйте.
Не вызывайте randomize внутри цикла. Повторные вызовы почти в один и тот же момент могут задать генератору одно и то же начальное значение, и числа начнут повторяться.
Массив из случайных чисел
program RandomArray;
var
a: array[1..10] of integer;
i: integer;
begin
randomize;
for i := 1 to 10 do
a[i] := random(101) - 50;
for i := 1 to 10 do
write(a[i], ' ');
writeln;
end.Каждый элемент — от −50 до 50. Так удобно проверять программы с массивами: не нужно каждый раз набирать данные.
Подводные камни
random(n)не включает n.random(10)никогда не даст 10.- Случайная буква — случайный символ строки: при
letters := 'abcdefghijklmnopqrstuvwxyz'записьletters[1 + random(length(letters))]даёт букву отaдоz. - Для паролей и всего, что связано с безопасностью, такой генератор не годится: его числа можно предсказать. Для учебных задач и игр его достаточно.