mtprng_init_by_array Subroutine

public subroutine mtprng_init_by_array(init_key, state)

NAME

mtprng_init_by_array(3f) - [M_random:MERSENNE TWISTER] Initialize the Mersenne Twister random number generator with "seed" array
(LICENSE:CUSTOM OPEN)

SYNOPSIS

subroutine mtprng_init_by_array(init_key, state)
integer(INT32), dimension(:), intent(in) :: init_key
type(mtprng_state), intent(out) :: state

DESCRIPTION

Initialize the Mersenne Twister random number generator with "seed" array

OPTIONS

state  generator state initialized by mtprng_init(3f) or mtprng_init_array(3f)

RETURNS

EXAMPLE

Sample program:

program demo_mtprng_init_by_array
use M_random, only : mtprng_state, mtprng_init_by_array
use M_random, only : mtprng_rand64, mtprng_rand_real1
use, intrinsic :: iso_fortran_env, only : int32, int64
implicit none
integer(INT32)     :: init_key(3)
type(mtprng_state) :: state
  GET_SEED: block
  integer :: count
  integer :: count_rate
     call system_clock(count, count_rate)
     init_key(1) = 11*count
     init_key(2) = 37*count
     init_key(3) = 97*count
  endblock GET_SEED
  call mtprng_init_by_array(init_key, state )
  ! returns a INT64 integer with a range in 0 .. 2^32-1
  write(*,*) mtprng_rand64(state)
  ! returns a IEEE64 real, may be used as double precision
  write(*,*) mtprng_rand_real1(state)
end program demo_mtprng_init_by_array

Arguments

Type IntentOptional Attributes Name
integer(kind=INT32), intent(in) :: init_key(:)
type(mtprng_state), intent(out) :: state

Source Code

subroutine mtprng_init_by_array(init_key, state)

! ident_9="@(#) M_random mtprng_int_by_array(3f) Initialize with an array of seeds"

! arguments
integer(INT32),intent(in)       :: init_key(:)
type(mtprng_state), intent(out) :: state

   ! working storage
   integer :: key_length
   integer :: i
   integer :: j
   integer :: k

   call mtprng_init(19650218_INT32,state)

   i = 1
   j = 0
   key_length = size(init_key)

   do k = max(N,key_length), 0, -1
      state%mt(i) = ieor(state%mt(i),(ieor(state%mt(i-1),ishft(state%mt(i-1),-30_INT64) * 1664525_INT64))) + init_key(j+1) + j

      i = i + 1
      j = j + 1

      if (i >= N) then
         state%mt(0) = state%mt(N-1)
         i = 1
      endif

      if (j >= key_length) j = 0
   enddo

   do k = N-1, 0, -1
      state%mt(i) = ieor(state%mt(i),(ieor(state%mt(i-1),ishft(state%mt(i-1),-30_INT64) * 1566083941_INT64))) - i

      i = i + 1

      if (i>=N) then
         state%mt(0) = state%mt(N-1)
         i = 1
      endif
   enddo

   state%mt(0) = 1073741824_INT64 ! 0x40000000, assuring non-zero initial array

end subroutine mtprng_init_by_array