Случайные числа
На первый взгляд может показаться, что случайным числам нет места в программировании роботов, однако в некоторых ситуациях они все же необходимы. Так, в игровых программах случайные числа могут имитировать подбрасывание кости или другое случайное событие.
В тех программах, в которых роботы учатся на своем опыте, первичная схема поведения часто носит случайный характер, однако робот учится модифицировать ее для получения более эффективной модели поведения.
Другое использование случайных чисел заключается в том, чтобы сделать поведение роботов более «человеческим». Люди часто ведут себя как бы случайно, но так только внешнее ощущение, поскольку просто не знаем, что у них на уме. Умеренное применение случайных чисел наделяет таким же качеством и роботов.
Хотя для удобства мы используем термин «случайные», на самом деле числа, генерируемые подпрограммой, абсолютно предсказуемы Просто последовательности чисел (нулей и единиц) настолько длинные до повторения, что выглядят случайными.
Правильным термином будет «псевдослучайные» числа.
Подпрограмма имитирует аппаратный генератор (псевдо)случайных чисел, в котором используется сдвиговый регистр.
Принцип заключается в том, что содержимое двух регистров (т и г.), составляющих сдвиговый регистр, подвергается операции логического «ИЛИ», и результат помещается обратно в первый регистр (0). Это формирует псевдослучайную последовательность чисел.
Длина этой последовательности зависит от того, какие регистры участвуют в операции. Как показано, а также, при m = 5 и п = 6, последовательность будет повторяться через каждые 127 битов.
Генератор имеет произвольный набор битов в своих регистрах, с которого он начинает, когда переменной .random (эквивалентна сдвиговому регистру) присваивается исходное значение. Это значение имеет в своем составе по крайней мере одну единицу.
Если начальное значение равно 00000000, то схемы логического «ИЛИ» не дадут на своем выходе ничего, кроме нулей.
Следующий шаг заключается в присвоении переменным bitm Hbitn значений, находящихся в регистрах 5 и 6.
Они подвергаются операции логического «ИЛИ» командой хог (эквивалент логической схемы «Исключающее ИЛИ»).
Результат этой операции (0 или 1) сохраняется в w, а затем складывается с константой ffh. Если результат выполнения операции исключающего «ИЛИ» равен 0, то значением w остается ffh, а флаг переноса остается сброшенным. Если же он будет равен 1, то значение изменяется на 00h, и флаг переноса устанавливается. Команда циклического сдвига влево, которая записывает флаг переноса в регистр 0, формирует новый набор значений в переменной random.
Для считывания случайного числа используйте команду btfss или btf sc для получения значения одного из разрядов переменной random.
Затем выполните действия, зависящие от того, будет ли полученный бит равен 0 или 1.
Биты также могут выбираться группами по два или больше для получения случайных чисел от 0 до 3 (отбор по два бита), от 0 до 7 (три бита) и т.д.
Листинг генератора случайных чисел всегда начинается с одного и того же начального значения.
Это формирует одну и ту же последовательность всякий раз при запуске генератора.
Лучше использовать начальное значение, которое получается случайно. Один из способов обеспечить это — начать с известного начального значения, однако затем обеспечить работу генератора в цикле в ожидании нажатия кнопки для останова генератора и продолжения работы программы.
В точности момент нажатия кнопки неизвестен, поэтому генерирование случайных чисел будет начинаться с неизвестного начального значения.
Источник: qwedr.com