Отметим, что случайные величины (или «случайно выбранные» числа) оказываются полезными не только для статистического моделирования, но и в численном анализе. Для решения различных задач были предложены так называемые методы Монте-Карло [Кнудт Д. Искуссиво программирования для ЭВМ. Т. 2]. Случайные числа используются также для формирования случайных выборок, необходимых при проведении различных социологических исследований. Случайность, кроме того, есть существенная часть оптимальных стратегий в теории игр. Генерирование случайных чисел в Фортране 90 выполняется подпрограммой RANDOM_NUMBER. Обращение к подпрограмме генерирования случайного числа имеет вид
CALL RANDOM_NUMBER(< имя переменной >),
![]() |
Кроме встроенной функции RANDOM_NUMBER во входных языках имеются дополнительные подпрограммы, реализующие генерирование случайных чисел, RANDOM и RAN, а также встроенные подпрограммы функции DRAND, DRANDM, IRAND, RAN и RAND. Все эти подпрограммы используют один и тот же алгоритм получения псевдослучайных чисел. В CVF
можно подключить библиотеку IMSLF90, и тогда будет доступна функция RAND, которая позволяет осуществлять заполнение случайными
числами массива любой размерности. При этом инициировать датчик нет
необходимости (см. пример). Программа,
показанная в примере, демонстрирует использование функции CONST(<имя>),
которая позволяет вычислять значение некоторых
констант. Здесь < имя> –
переменная строкового типа. Проверить работу
программы |
Здесь <имя переменной> – имя возвращаемой (тип OUT) переменной: скаляра или массива. Эта переменная вещественного типа, содержащая случайное число или массив случайных чисел, которые имеют равномерное распределения на промежутке [0; 1). Например программа
PROGRAM RAND_P
REAL X, X_RAND(0:3)
CALL RANDOM_NUMBER(X)
CALL RANDOM_NUMBER(X_RAND)
PRINT *, 'X= ',X
PRINT *, 'X_RAND= ',X_RAND
END
Генерирует и печатает случайное число X и массив случайных чисел X_RAND.
Алгоритм генерирования инициируется специальным массивом, значение которого устанавливается подпрограммой RANDOM_SEED. Эта программа также может изменить значения инициирующего массива. Обращение к подпрограмме имеет вид
CALL RANDOM_SEED([PARAM]),
PARAM принимает одно из трех значений:
size – стандартное целое число имеющее вид связи OUT и равное размеру задаваемого алгоритмом генерирования инициирующего массива;
put – стандартный целый массив с видом связи IN, изменяющий значение инициирующего массива;
get – стандартный целый массив с видом связи OUT, в который заносится текущее значение инициирующего массива.
![]() |
PROGRAM RAND_P INTEGER K ! Размер инициирующих массивов INTEGER, PARAMETER :: N=3 ! Разрешаем динамическое размещение массивов, инициирующих генерирование ! случайных чисел: RAND_0 – задается с использование системного времени, ! а RAND_NEW – задается программистом INTEGER, ALLOCATABLE :: RAND_0(:),RAND_NEW(:) ! Вещественная переменная и массив для размещения случайных чисел REAL X, X_RAND(0:N) ! Используем обращение к функции для чтения размера инициирующего массива CALL RANDOM_SEED(SIZE=k) ! Задаем инициирующий массив по значению системного времени CALL RANDOM_SEED() PRINT *, ' K= ',K ! Размещаем в памяти инициирующие массивы ALLOCATE(RAND_0(K)) ALLOCATE(RAND_NEW(K)) ! Передаем значения элементов инициирующего массива, ! заданные по системному времени CALL RANDOM_SEED(GET=RAND_0) PRINT *,'INITIAL ARRAY' PRINT 2, RAND_0 ! Задаем новые значения элементов инициирующего массива DO I=1,K RAND_NEW(I)=I*50 END DO PRINT *,'NEW INITIAL ARRAY' 2 FORMAT(10I15) PRINT 2, RAND_NEW CALL RANDOM_SEED(PUT=RAND_NEW) CALL RANDOM_NUMBER(X) CALL RANDOM_NUMBER(X_RAND) 1 FORMAT(2F10.5) PRINT *, 'X= ',X PRINT *, ' ARRAY X_RAND' PRINT 1, X_RAND END На рисунках 1.15а и 1.15б показаны результаты двух последовательных запусков программы. Проверить работу программы, осуществив несколько запусков программы (RAND_PG.exe) |