Spec-Zone.ru › GNU Fortran 5

9.215 RANDOM_SEED — Инициализировать последовательность псевдослучайных чисел

Описание:
Перезапускает или запрашивает состояние генератора псевдослучайных чисел, используемого RANDOM_NUMBER.

Если RANDOM_SEED вызывается без аргументов, оно инициализируется по умолчанию. Пример ниже показывает, как инициализировать seed со случайным значением, чтобы гарантировать разную последовательность случайных чисел при каждом вызове программы. Обратите внимание, что избегайте установления любого из значений seed в ноль, так как это может привести к генерации случайных чисел низкого качества.

Стандарт:
Fortran 95 и более поздние версии
Класс:
Подпрограмма
Синтаксис:
CALL RANDOM_SEED([SIZE, PUT, GET])
Аргументы:
SIZE (Необязательно) Должен быть скалярным и типа default INTEGER, с INTENT(OUT). Он задает минимальный размер массивов, используемых с аргументами PUT и GET.
PUT (Необязательно) Должен быть массивом типа default INTEGER и ранга один. Он INTENT(IN) и размер массива должен быть больше или равен числу, возвращенному аргументом SIZE.
GET (Необязательно) Должен быть массивом типа default 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
См. также:
RANDOM_NUMBER

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-5.4.0/gfortran/RANDOM_005fSEED.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API