У меня есть книжка С.В.Поршнев "Компьютерное моделирование физических процессов в Matlab". Он заглядывал во 2-й том "Искусства программирования" Д.Кнута, о чем свидетельствует список литературы
. Вот что Поршнев пишет про ГПСЧ:
Алгоритм генерации случайных чисел с равномерным законом распределения
Aлгоритм генерации случайных чисел с заданным законом распределения основан на использовании случайных чисел с равномерным законом распределения. Следовательно, точность вычисления интеграла зависит не только от количества точек, используемых для вычисления значения интеграла, но и от качества работы генератора случайных чисел.
Для применения в вычислительных экспериментах генератор должен обладать следующими характеристиками:
— хорошими вычислительными свойствами,
— эффективностью,
— большим периодом,
— воспроизводимостью.
Первыми и наиболее важными из рассматриваемых характеристик являются, конечно, статистические свойства. Известен пример, когда использование плохого генератора случайных чисел в методе молекулярной динамики привело к обнаружению особого поведения системы определенного размера. Результаты независимого исследования, проведенного другими авторами, не подтвердили этой особенности. Это позволило сделать вывод о том, что причиной обнаруженной особенности явилось плохое качество генератора случайных чисел.
Также очень важна вычислительная эффективность генератора. Программы для компьютерных экспериментов требуют огромного числа случайных чисел. Для получения порядка 10^10 чисел за ограниченное время одно случайное число должно вычисляться очень быстро. Кроме того, важно требование на размер необходимой для работы генератора памяти компьютера. Генератор должен быть достаточно быстрым и экономичным по памяти.
В действительности, генерируются не случайные числа, а последовательности псевдослучайных чисел, поэтому последовательность генерируемых чисел после определенного количества шагов повторяет саму себя. Ее период должен быть заведомо больше длины, необходимой для последовательности случайных чисел. Опасность представляет также исчерпание последовательности случайных чисел или даже приближение конца ее цикла. Это также приводит к неверным результатам.
Существуют различные способы генерации на компьютере случайных чисел. Далее мы рассмотрим, в первую очередь, наиболее широко распространенные в настоящее время методы, объединенные обидим названием «линейные конгруэнтные генераторы». Они производят определенным способом при задании начального целого числа последовательность случайных чисел с равномерным законом распределения. Несомненным достоинством генераторов данного типа является их воспроизводимость.
Линейный конгруэнтный генератор выдает последовательность произвольных целых чисел, которые можно привести к единичному интервалу [0,1]. Для этого достаточно разделить все члены последовательности на максимальное возможное целое число. Ненормированная последовательность целых чисел, однако, предпочтительнее по причине большей вычислительной эффективности алгоритма.
Алгоритм линейного конгруэнтного генератора (Лемер, 1948)
Пусть
m, а, с, х0 - причем
m > х0, m > а, m > с и х0 > 0, а > 0, с > 0.
Тогда псевдослучайное число последовательности
xi, получается из предшествующего ему числа
x(i-1) как
xi=(a-xi+c)mod
m
(Здесь mod - функция деления по модулю, т. е. функция получения остатка от деления одного числа на другое. Например 19 mod 4 = 3.)
При соответствующем выборе чисел
m, а, с, х0 алгоритм выдает последовательность случайных чисел. При этом генерируемая последовательность имеет повторяющийся цикл или период, не превышающий
m чисел. Для получения достоверных результатов при моделировании физических систем необходимо использовать генераторы с максимально большим периодом. Максимальный период достигается при
с<>0. Такой генератор называется смешанным. Однако, как показала практика, смешанные генераторы дают плохие результаты по сравнению с генераторами, у которых с=0 (мультипликативные генераторы). Отметим, что для обеспечения максимального периода мультипликативного конгруэнтного генератора модуль
m и множитель
а необходимо подбирать специально.
Алгоритм линейного конгруэнтного генератора в пакете MATLAB реализуется выполнением следующей последовательности команд:
» а=7;
» с=7;
» m=55;
» х(1)=20;
» N=100;
» for i=1:N
x(i+1)=mod(a*x(i)+c,m);
end;
» i=1:N+1; plot(i, x, ‘-kS’);
» axis([0 100 0 60]);