9.216 RANDOM_SEED — Инициализация последовательности псевдослучайных чисел
- Описание:
-
Перезапускает или запрашивает состояние генератора псевдослучайных чисел, используемого в
RANDOM_NUMBER.Если
RANDOM_SEEDвызывается без аргументов, оно инициализируется в стандартном состоянии. Пример ниже демонстрирует, как инициализировать семенной элемент со значением, изменяющимся в каждом вызове программы, чтобы гарантировать различную последовательность псевдослучайных чисел. Обратите внимание, что задание любого из значений семян равным нулю следует избегать, так как это может привести к генерации псевдослучайных чисел низкого качества. - Стандарт:
-
Fortran 95 и более поздние версии
- Класс:
-
Подпрограмма
- Синтаксис:
-
CALL RANDOM_SEED([SIZE, PUT, GET]) - Аргументы:
-
SIZE (Необязательно) Должен быть скаляром типа стандартный INTEGER, сINTENT(OUT). Указывает минимальный размер массивов, используемых с аргументами PUT и GET.PUT (Необязательно) Должен быть массивом типа стандартный INTEGERи ранга один. ОнINTENT(IN)и размер массива должен быть больше или равен числу, возвращенному аргументом SIZE.GET (Необязательно) Должен быть массивом типа стандартный INTEGERи ранга один. ОнINTENT(OUT)и размер массива должен быть больше или равен числу, возвращенному аргументом SIZE. - Пример:
-
subroutine init_random_seed() use iso_fortran_env, only: int64 implicit none integer, allocatable :: seed(:) integer :: i, n, un, istat, dt(8), pid integer(int64) :: t call random_seed(size = n) allocate(seed(n)) ! First try if the OS provides a random number generator open(newunit=un, file="/dev/urandom", access="stream", & form="unformatted", action="read", status="old", iostat=istat) if (istat == 0) then read(un) seed close(un) else ! Fallback to XOR:ing the current time and pid. The PID is ! useful in case one launches multiple instances of the same ! program in parallel. call system_clock(t) if (t == 0) then call date_and_time(values=dt) t = (dt(1) - 1970) * 365_int64 * 24 * 60 * 60 * 1000 & + dt(2) * 31_int64 * 24 * 60 * 60 * 1000 & + dt(3) * 24_int64 * 60 * 60 * 1000 & + dt(5) * 60 * 60 * 1000 & + dt(6) * 60 * 1000 + dt(7) * 1000 & + dt(8) end if pid = getpid() t = ieor(t, int(pid, kind(t))) do i = 1, n seed(i) = lcg(t) end do end if call random_seed(put=seed) contains ! This simple PRNG might not be good enough for real work, but is ! sufficient for seeding a better PRNG. function lcg(s) integer :: lcg integer(int64) :: s if (s == 0) then s = 104729 else s = mod(s, 4294967296_int64) end if s = mod(s * 279470273_int64, 4294967291_int64) lcg = int(mod(s, int(huge(0), int64)), kind(0)) end function lcg end subroutine init_random_seed - См. также:
Далее: RANGE, Предыдущее: RANDOM_NUMBER, Вверх: Встроенные процедуры [Содержание][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-6.4.0/gfortran/RANDOM_005fSEED.html