module marsaglia
implicit none
private
public :: kiss, kisset
   INTEGER :: x=123456789, y=362436069, z=521288629, w=916191069
contains
   FUNCTION kiss ()
      integer :: kiss
! The  KISS (Keep It Simple Stupid) random number generator. Combines:
! (1) The congruential generator x(n)=69069*x(n-1)+1327217885, period 2^32.
! (2) A 3-shift shift-register generator, period 2^32-1,
! (3) Two 16-bit multiply-with-carry generators, period 597273182964842497>2^59
!  Overall period>2^123;  Default seeds x,y,z,w.
!  Set your own seeds with statement i=kisset(ix,iy,iz,iw).
!
      x = 69069 * x + 1327217885
      y = m (m (m (y, 13), - 17), 5)
      z = 18000 * iand (z, 65535) + ishft (z, - 16)
      w = 30903 * iand (w, 65535) + ishft (w, - 16)
      kiss = x + y + ishft (z, 16) + w
   contains
      function m(k, n)
         integer :: m, k, n
         m = ieor (k, ishft (k, n) )
      end function m
   END FUNCTION kiss
   function kisset (ix, iy, iz, iw)
      integer :: kisset, ix, iy, iz, iw
      x = ix
      y = iy
      z = iz
      w = iw
      kisset = 1
   end function kisset
end module marsaglia

!     PROGRAM test
!     use marsaglia
!     PRINT *, kiss ()
!     PRINT *, kisset (1, 2, 3, 4)
!     PRINT *, kiss ()
!     END PROGRAM test
