Initializes by an array with array-length
init_key
is the array for initializing keys
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(mt19937), | intent(inout) | :: | me | |||
integer(kind=i8), | intent(in) | :: | init_key(:) |
subroutine init_by_array64(me,init_key)
!! Initializes by an array with array-length
!! `init_key` is the array for initializing keys
implicit none
class(mt19937),intent(inout) :: me
integer(i8), intent(in) :: init_key(:)
integer(i8), parameter :: c1 = 3935559000370003845_i8
integer(i8), parameter :: c2 = 2862933555777941757_i8
integer(i8) :: i, j, k, kk, key_length
call me%init_genrand64(19650218_i8)
key_length = size(init_key)
i = 1_i8; j = 0_i8
k = max(nn, key_length)
do kk = 1, k
me%mt(i+1) = ieor(me%mt(i+1), c1 * ieor(me%mt(i), ishft(me%mt(i), -62))) &
+ init_key(j+1) + j
i = i+1; j = j+1
if(i >= nn) then
me%mt(1) = me%mt(nn)
i = 1
end if
if(j >= key_length) j = 0
end do
do kk = 1, nn-1
me%mt(i+1) = ieor(me%mt(i+1), c2 * ieor(me%mt(i), ishft(me%mt(i), -62))) - i
i = i+1
if(i >= nn) then
me%mt(1) = me%mt(nn)
i = 1
end if
end do
me%mt(1) = ishft(1_i8, 63) ! MSB is 1; assuring non-zero initial array
end subroutine init_by_array64