random_kiss64 Function

public function random_kiss64()

NAME

   random_kiss64 - [M_random] A 64-bit KISS random number generator by George Margaglia.

SYNOPSIS

function random_kiss64()
integer, parameter         :: i8b = selected_int_kind(18)  ! eight-byte integer
integer(i8b)               :: random_kiss64

DESCRIPTION

A simple random number generator that returns a random 64-bit INTEGER. The same
sequence is returned.

EXAMPLE

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

Arguments

None

Return Value integer(kind=i8b)


Source Code

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