ГСЧ в языках программированияПоследнее, на чем следует остановить внимание, это
особенности использования стандартных генераторов случайных чисел
в различных языках программирования, если уж ими пришлось
воспользоваться. Так отметим, что известный в Бейсике оператор
RANDOMIZE (Он такой же, как и во всех других языках
программирования. например. Pascal или C++.), применяемый для
начальной установки генератора случайных чисел, может ошарашить
пользователя. Ибо после выполнения:
RANDOMIZE 231 х = RND RANDOMIZE 231 у = RND
необязательно получится х=у, потому что оператор RANDOMIZE
переустанавливает не всё случайное число из 3 байт, а лишь его
часть из 2 байт. Точная установка может быть произведена функцией
RND, как x=RND(-231). Не нужно думать, что эта проблема
встречается лишь при программировании на Бейсике. Паскаль и Си
всех фирм дают те же результаты. А вот увеличение периода
последовательности сделать несколько сложнее. Для этого можно
использовать функцию:
FUNCTION Rand (х, у) х = RND (-х) у = RND (-у): IF у = О THEN у = RND (-у) Rand = (х+у) MOD 1 END FUNCTION
Период такой функции равен 2**24-(2**24-1), но вот свойства
его ряда не обязаны при любых исходных х и у быть такими же
хорошими, как у RND.
При создании с помощью встроенного генератора случайных чисел
объектов, имеющих число состояний большее, чем у генератора, его
приходится использовать несколько раз, переустанавливая по
заранее заданному ключу. Например, следующий фрагмент программы:
FOR i = 1 ТО 5 х = RND (-gamma (i)) FOR j = 0 TO 32 SWAP map (j), map (32 * RND) NEXT: NEXT
производит случайную перестановку 33 элементов массива map,
которая может быть сделана примерно 2**118 способами, и при длине
периода генератора в 2**24, его нужно запустить не менее 5 раз,
чтобы реализовать все варианты перестановки.
|