random_kiss64 - [M_random] A 64-bit KISS random number generator by George Margaglia.
function random_kiss64()
integer, parameter :: i8b = selected_int_kind(18) ! eight-byte integer
integer(i8b) :: random_kiss64
A simple random number generator that returns a random 64-bit INTEGER. The same
sequence is returned.
Sample usage:
program demo_random_kiss64
use M_random, only : random_kiss64
implicit none
integer, parameter :: i8b = selected_int_kind(18) ! eight-byte integer
integer(i8b) :: i, t
write(*,*)'HUGE=',huge(0_i8b)
do i = 1, 100000000
t = random_kiss64()
if(mod(i,1000000_i8b+1_i8b)==1000000_i8b)write(*,*)i,' T=',T
enddo
if (t .eq. 1666297717051644203_i8b) then
print *, "100 million calls to KISS() OK"
else
print *, "Fail"
endif
end program demo_random_kiss64
function random_kiss64() ! ident_4="@(#) M_random random_kiss64(3f) A 64-bit KISS random number generator by George Margaglia." ! From: FortranWiki.org ! Originally posted to comp.lang.fortran in the message 64-bit KISS RNGs. ! No license was specified. ! ! Revised on April 14, 2010 21:40:44 by Jason Blevins (75.178.9.182) ! This version was modified by Jason Blevins to use "implicit none" ! and to declare the 64-bit/eight-byte integer type in a portable manner. !----------------------------------------------------------------------------------------------------------------------------------- integer, parameter :: i8b = selected_int_kind(18) ! eight-byte integer integer(i8b), save :: x, y, z, c integer(i8b) :: t, k, m, s, random_kiss64 data x, y, z, c & / 1234567890987654321_i8b, & 362436362436362436_i8b, & 1066149217761810_i8b, & 123456123456123456_i8b / !----------------------------------------------------------------------------------------------------------------------------------- m(x,k) = ieor(x, ishft(x,k)) ! statement function s(x) = ishft(x, -63) ! statement function !----------------------------------------------------------------------------------------------------------------------------------- t = ishft(x, 58) + c if (s(x) .eq. s(t)) then c = ishft(x, -6) + s(x) else c = ishft(x, -6) + 1 - s(x + t) endif x = t + x y = m(m(m(y,13_i8b),-17_i8b), 43_i8b) z = 6906969069_i8b * z + 1234567 random_kiss64 = x + y + z end function random_kiss64