Практикум по среде и языку QBasic__________________________153

увидим, что "случайность" прячется не в процедуре, а в функции. Если вы запустите эту программу непосредственно после входа в среду, то процедура для неотрицательных значений параметра выдает числа равные значению параметра деленному на 65536, а для отрицательных — числа равные разности 1 и модуля параметра деленного на 65536. Если же вы запустите ее после вызова функции RND, то процедура добавляет к последнему значению случайной функции вышеприведенное значение. При этом если сумма больше или равна 1, то из нее вычитается 1.

Проверим теперь насколько среднее значение и дисперсия генерируемой последовательности соответствуют обещанному равномерному распределению. С этой целью накопим значения суммы чисел и суммы квадратов чисел для выборки большого размера и вычислим статистические характеристики с помощью следующей программы. CLS 'очистка экрана МЕДМ!=0 'ячейка для накопления суммы DISP!=0 'ячейка для накопления суммы квадратов FOR I%=1 ТО 32000 'начало цикла накопления X!=RND 'случайное число MEAN!=MEAN!+Х! 'накопление суммы DISP!=DISP!+X!*Х! 'накопление суммы квадратов NEXT 1% 'конец цикла накопления MEAN!=MEAN!/32000 'среднее значение DISP!=DISP!/32000-MEAN!*MEAN!

'среднеквадратичное отклонение PRINT MEAN!,SQR(DISP!) 'вывод среднего и дисперсии

Расчеты показывают, что выведенные значения близки к теоретическим величинам равным одной второй и корню из одной двенадцатой соответственно.

Гораздо более серьезные испытания на периодичность генерируемых чисел мы рассматривать не будем. В них нет особых сложностей за исключением невероятно большого объема вычислений. Как мы уже выяснили в третьем занятии, для представления мантиссы чисел типа SINGLE используется 3 байта. Предполагая, что генератор случайных чисел использует все значения мантиссы, можно оценить максимальное значение периода значением 2 А 24, то есть более 16 миллиардов.

Интерпретируя алгоритм генерации случайных чисел как чтение из очень большого массива неповторяющихся действительных чисел от 0 до 1, можно описать это чтение следующим образом. При отрицательном значении параметра производится чтение по индексу равному модулю параметра. При нулевом значении параметра производится чтение по старому значению индекса. В остальных случаях значение индекса перед чтением увеличивается на 1 (при выходе за пределы массива из индекса вычитается размер массива). Разумеется, реальный алгоритм обходится без хранения массива чисел, а использует некоторую неизвестную нам функцию от выданного при предыдущем обращении числа.

Рассмотрим две задачи программировании игр, при решении которых необходимо использовать генератор случайных чисел. Первая задача