Случайные числа
В процессе изучения циклических алгоритмов уместно рассказать о генерации случайных чисел программным путем. При кажущейся простоте получить случайные числа не так легко. Попробуйте продиктовать своему другу 100 цифр. В идеале каждая из них должна бы повториться по теории вероятности около 10 раз, но у каждого человека встречаются какие-то пристрастия к тем или иным цифрам и в ряду из сотни цифр не будет абсолютной случайности. Получить на компьютере случайные числа тоже было нелегко, но в конце концов это удалось.
В качестве основы для создания какой-либо последовательности случайных чисел служат показания встроенного в компьютер таймера. А поскольку они в каждый момент времени различны, то мы и получаем великое множество практически неповторяющихся случайных чисел в заданном диапазоне.
Случайные числа нужны прежде всего в компьютерных играх, чтобы обеспечить непредсказуемость игры для человека. Кроме того, они используются в учебных задачах и моделировании различных математических, физических и других процессов на компьютере.
Итак, новый оператор rnd.
Чтобы получать случайные числа, вы прежде всего должны инициировать процесс генерации последовательности случайных чисел компьютером при помощи оператора randomize timer. Он указывается в программе только один раз и сообщает компьютеру, что надо создавать случайные числа, беря за основу показания таймера.
Затем, чтобы получить из этой последовательности какое-либо значение, мы должны использовать оператор rnd(n), который выдает случайное число в диапазоне от 0 до 1. Минимальное полученное число будет 0.0000001, а максимальное 0.9999999. В качестве N может служить любое целое или действительное число. Этот параметр также влияет на выбор компьютером случайных чисел. Например, программа:
RANDOMIZE TIMER X=RND(1)? X
Может вывести на экран число 0.367423, а может 0.0034289, а может 0.8912314. Каждый раз при запуске программы мы будем видеть новое значение.
Но часто встает проблема получения случайных чисел в заданном диапазоне. Как это сделать, мы рассмотрим на примерах.
Моделирование бросания монеты
Нам необходимо при каждом запуске программы случайным образом получать либо число 0 ("решка"), либо 1 ("орел"). Если мы будем просто брать целую часть от полученного при помощи rnd(N) случайного числа, то всегда будем получать 0.
Попробуем умножить rnd(N) на 2. В результате имеем числа от 0.0000002 до 1.9999998. Если мы теперь будем брать целую часть, то как раз и получим 0 или 1. Программа выглядит следующим образом:
CLS RANDOMIZE TIMER X=INT(RND(1)*2) IF X=0 THEN? "У вас выпала решка" ELSE? "У вас выпал орел"
Моделирование бросания игрального кубика
Казалось бы надо пойти по уже проторенному пути первого примера и, раз нам надо получить цифры от 1 до 6, просто умножить rnd(N) на 6. Но, если разобраться, то обнаружится, что при этом мы будем получать числа в диапазоне от 0.0000006 до 5.9999994. Взятая целая часть даст нам числа от 0 до 5. На 6 никак не выходим. Хорошо, умножим на rnd(N) 7. Тогда получим числа от 0.0000007 до 6.9999993. Теперь получается 6, но нам ведь совсем не нужен 0. Что же делать? Очень просто – умножаем на 6 и прибавляем 1!
CLS RANDOMIZE TIMER X=INT(RND(1)*6)+1 ? X
Так как в дальнейшем нам придется часто сталкиваться с заданиями, требующими использование случайных чисел, то необходимо потренироваться.
Напишите операторы для получения случайных целых чисел в интервалах.
171. От 1 до 10.
172. От -5 до +5.
173. От 10 до 20.
174. От 50 до 100.
175. От -35 до 65.