Генерация псевдослучайных последовательностей

| рубрика «Программы» | автор st
Метки:

В массово-калькуляторную эпоху еще до появления МК-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 - текущая минута.

Приведенный список далеко не полный, буду рад любым дополнениям.