1.21. СЛУЧАЙНЫЕ ЧИСЛА

Отметим, что случайные величины (или «случайно выбранные» числа) оказываются полезными не только для статистического моделирования, но и в численном анализе. Для решения различных задач были предложены так называемые методы Монте-Карло [Кнудт Д. Искуссиво программирования для ЭВМ. Т. 2]. Случайные числа используются также для формирования случайных выборок, необходимых при проведении различных социологических исследований. Случайность, кроме того, есть существенная часть оптимальных стратегий в теории игр. Генерирование случайных чисел в Фортране 90 выполняется подпрограммой RANDOM_NUMBER. Обращение к подпрограмме генерирования случайного числа имеет вид

Закрыть

Методы Монте-Карло (ММК) – это численные методы решения математических задач с помощью моделирования случайных величин. ММК позволяют успешно решать математические задачи, обусловленные вероятностными процессами. Более того, при решении задач, не связанных с какими-либо вероятностями, можно искусственно придумать вероятностную модель (и даже не одну), позволяющую решать эти задачи. Рассмотрим вычисление определенного интеграла

Image55

При вычислении этого интеграла по формуле прямоугольников интервал [a,b] разбиваем на N одинаковых интервалов, в серединах которых вычислялись значения подынтегральной функции. Вычисляя значения функции в случайных узлах, можно получить более точный результат:

Image56

Image57

Здесь γi  – случайное число, равномерно распределенное на интервале [0, 1). Погрешность вычисления интеграла ММК ~, что значительно больше, чем у ранее изученных детерминированных методов.

CALL RANDOM_NUMBER(< имя переменной >),

Закрыть

Кроме встроенной функции RANDOM_NUMBER во входных языках имеются дополнительные подпрограммы, реализующие генерирование случайных чисел,

RANDOM  и RAN, а также встроенные подпрограммы функции DRAND, DRANDM, IRAND, RAN и RAND. Все эти подпрограммы используют один и тот же алгоритм получения псевдослучайных чисел.

            В CVF можно подключить библиотеку IMSLF90, и тогда будет доступна функция RAND, которая позволяет осуществлять заполнение случайными числами массива любой размерности. При этом инициировать датчик нет необходимости (см. пример). Программа, показанная в примере, демонстрирует использование функции CONST(<имя>), которая позволяет вычислять значение некоторых констант. Здесь < имя> – переменная строкового типа. Проверить работу программы, осуществив несколько запусков программы, задавая различные значения K.

Закрыть

PROGRAM RAND_A

USE IMSLf90

INTEGER K

REAL, ALLOCATABLE :: R_A(:,:), R_X(:)

CHARACTER (LEN=1)ST

  PI=CONST('PI')

  PRINT *, '  PI= ',PI

  PRINT *, ' INPUT K= '

  READ *, K

  ALLOCATE(R_A(0:K,0:K))

  ALLOCATE(R_X(0:K))

  R_A= RAND(R_A)

  R_X=RAND(R_X)

  PRINT *,'RANDOM MATRIX'

2 FORMAT(<K+1>F8.4)

  PRINT 2, R_A

  PRINT *,'RANDOM VECTOR'

  PRINT 2, R_X

3 CONTINUE          

            PRINT * ,'PRESS Y TO PROGRAM TERMINATE'

    READ *, ST   

            IF (ST/='Y'.AND.ST/='y') THEN

                        GOTO 3        

            END IF

END

Закрыть

Avogadro – число Авогадро;

Boltzman – постоянную Больцмана;

Pi  –  число ;

Planck – постоянную Планка и др. [ссылка на isml1].

Здесь <имя переменной>  – имя возвращаемой (тип 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)

Закрыть

1.15а.                                                             1.15.б.

Рисунок 1.15. Результат использования встроенных функций RANDOM_NUMBER