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