To restore my points, I was obliged to find my own answer, here it is (after one hour of trying)
Main program
program callrtmod use mymod implicit none real::x x=1.0 write(*,*) x+writerandnum() write(*,*) x+writerandnum() write(*,*) x+writerandnum() end program callrtmod
here is my module
module mymod implicit none !-------------mt variables------------- ! Default seed integer, parameter :: defaultsd = 4357 ! Period parameters integer, parameter :: N = 624, N1 = N + 1 ! the array for the state vector integer, save, dimension(0:N-1) :: mt integer, save :: mti = N1 !-------------------------------------- contains function writerandnum implicit none real(8)::writerandnum writerandnum = grnd() !if you please, you could perform a Metropolis test here too end function writerandnum !Initialization subroutine subroutine sgrnd(seed) implicit none integer, intent(in) :: seed mt(0) = iand(seed,-1) do mti=1,N-1 mt(mti) = iand(69069 * mt(mti-1),-1) enddo ! return end subroutine sgrnd !--------------------------------------------------------------------------- !the function grnd was here !--------------------------------------------------------------------------- subroutine mtsavef( fname, forma ) character(*), intent(in) :: fname character, intent(in) :: forma select case (forma) case('u','U') open(unit=10,file=trim(fname),status='UNKNOWN',form='UNFORMATTED', & position='APPEND') write(10)mti write(10)mt case default open(unit=10,file=trim(fname),status='UNKNOWN',form='FORMATTED', & position='APPEND') write(10,*)mti write(10,*)mt end select close(10) return end subroutine mtsavef subroutine mtsaveu( unum, forma ) integer, intent(in) :: unum character, intent(in) :: forma select case (forma) case('u','U') write(unum)mti write(unum)mt case default write(unum,*)mti write(unum,*)mt end select return end subroutine mtsaveu subroutine mtgetf( fname, forma ) character(*), intent(in) :: fname character, intent(in) :: forma select case (forma) case('u','U') open(unit=10,file=trim(fname),status='OLD',form='UNFORMATTED') read(10)mti read(10)mt case default open(unit=10,file=trim(fname),status='OLD',form='FORMATTED') read(10,*)mti read(10,*)mt end select close(10) return end subroutine mtgetf subroutine mtgetu( unum, forma ) integer, intent(in) :: unum character, intent(in) :: forma select case (forma) case('u','U') read(unum)mti read(unum)mt case default read(unum,*)mti read(unum,*)mt end select return end subroutine mtgetu !=============================================== !Random number generator ! real(8) function grnd() function grnd !agregue yo implicit integer(az) real(8) grnd !agregue yo ! Period parameters integer, parameter :: M = 397, MATA = -1727483681 ! constant vector a integer, parameter :: LMASK = 2147483647 ! least significant r bits integer, parameter :: UMASK = -LMASK - 1 ! most significant wr bits ! Tempering parameters integer, parameter :: TMASKB= -1658038656, TMASKC= -272236544 dimension mag01(0:1) data mag01/0, MATA/ save mag01 ! mag01(x) = x * MATA for x=0,1 TSHFTU(y)=ishft(y,-11) TSHFTS(y)=ishft(y,7) TSHFTT(y)=ishft(y,15) TSHFTL(y)=ishft(y,-18) if(mti.ge.N) then ! generate N words at one time if(mti.eq.N+1) then ! if sgrnd() has not been called, call sgrnd( defaultsd ) ! a default initial seed is used endif do kk=0,NM-1 y=ior(iand(mt(kk),UMASK),iand(mt(kk+1),LMASK)) mt(kk)=ieor(ieor(mt(kk+M),ishft(y,-1)),mag01(iand(y,1))) enddo do kk=NM,N-2 y=ior(iand(mt(kk),UMASK),iand(mt(kk+1),LMASK)) mt(kk)=ieor(ieor(mt(kk+(MN)),ishft(y,-1)),mag01(iand(y,1))) enddo y=ior(iand(mt(N-1),UMASK),iand(mt(0),LMASK)) mt(N-1)=ieor(ieor(mt(M-1),ishft(y,-1)),mag01(iand(y,1))) mti = 0 endif y=mt(mti) mti = mti + 1 y=ieor(y,TSHFTU(y)) y=ieor(y,iand(TSHFTS(y),TMASKB)) y=ieor(y,iand(TSHFTT(y),TMASKC)) y=ieor(y,TSHFTL(y)) if(y .lt. 0) then grnd=(dble(y)+2.0d0**32)/(2.0d0**32-1.0d0) else grnd=dble(y)/(2.0d0**32-1.0d0) endif return end function grnd end module mymod
check my decision and vote for me;) [of course, as you can see, I modified the mt.f90 code, which should be conveniently included in my module, so I can separately store the main program from the generation part of randon numbers, so I can do a test Metropolis towards the main program. The main program just wants to know if the decision was made or not. My decision really gives more clarity to the main program]