Генерация псевдослучайных последовательностей
В массово-калькуляторную эпоху еще до появления МК-61/52 с командой КСч, в программах требовалось генерировать случайные числа. Также оказалось, что команда КСч была реализована не самым удачным образом, поэтому вопрос до конца не был решен, см. "Тайна ГСЧ раскрыта?" НиЖ №6-1989, "Беседа о случайных цифрах" НиЖ №12-1989. Поскольку размер кода была ограничен, то приходилось использовать наиболее простые и короткие алгоритмы. Думаю, они могут пригодится и сейчас любому программисту, поставленному в условия ограниченного объема памяти и отсутствия подходящих библиотечных (встроенных) функций.
Генерация неповторяющейся последовательности целых чисел диапазона [1, P)
Использовалась в программировании игры "Морской бой".
Ni+1 = Ni * Q - INT(Ni * Q / P) * P
- Ni - текущее случайное число;
- INT() - функция выделения целой части дробного числа;
- P - простое число;
- Q = P - 3m выбирается близким к P/2.
N0 задаётся из указанного диапазона.
Например, для P = 101 и Q = 74 (m = 3) получаем генератор в диапазоне [1, 100].
Генерация действительных чисел в диапазоне (0, 1)
Использование степенной функции
ai+1 = 10ai - INT(10ai)
- ai - текущее случайное число;
- INT() - функция выделения целой части дробного числа.
a0 задаётся из указанного диапазона.
Использование константы Пи
Вариант 1. ai+1 = FRAC(11 * ai + Пи)
Вариант 2. ai+1 = FRAC((ai + Пи)5)
- ai - текущее случайное число;
- FRAC() - функция выделения дробной части числа.
a0 задаётся из указанного диапазона. Можно использовать число в формате 0,ddhhmm
, где dd - текущий день, hh - текущий час, mm - текущая минута.
Приведенный список далеко не полный, буду рад любым дополнениям.
blog comments powered by Disqus