! @file ranlibExF.f90
! @Author Mitch Richling<http://www.mitchr.me/>
! @Copyright Copyright 1994 by Mitch Richling. All rights reserved.
! @breif Example of RANLIB@EOL
! @Keywords example of ranlib
! @Std F90
! @Notes We demonstrate the basic use of RANLIB with a simple example..
!
! RANLIB has been around for a long time, and has a well understood
! track record. The package has 32 random number generators that
! may be independently seeded and reseeded. An easy way is
! provided to simultaneously seed all generators to provide 32
! independent, non-overlapping sequences of random numbers. Each
! generator sequence can be advanced a power of two forward to
! provide many parallel, smaller modulus, streams if 32 isn't
! enough.
!
! The library also provides functions to generate random
! variates from common distributions:
! GENBET GeNerate BETa random deviate
! GENCHI Generate random value of CHIsquare variable
! GENEXP GENerate EXPonential random deviate
! GENF GENerate random deviate from the F distribution
! GENGAM GENerates random deviates from GAMma distribution
! GENMN GENerate Multivariate Normal random deviate
! GENMUL GENerate an observation from the MULtinomial distribution
! GENNCH Generate random value of Noncentral CHIsquare variable
! GENNF GENerate random deviate from the Noncentral F distribution
! GENNOR GENerate random deviate from a NORmal distribution
! GENUNF GeNerate Uniform Real between LOW and HIGH
! IGNBIN GENerate BINomial random deviate
! IGNNBN GENerate Negative BiNomial random deviate
! IGNPOI GENerate POIsson random deviate
! IGNUIN GeNerate Uniform INteger
!
! Even a few kooky, buy handy functions are provided:
! PHRTSD PHRase To SeeDs
! GENPRM GENerate random PeRMutation of iarray
!
! RANLIB is available from NetLib. A C version exists
! too. I have a partial F90 style interface avaiable with
! this code.
!
program ranlibEx
USE ranlibM
implicit none
integer :: j, genNum, seed1, seed2
integer :: ranInt1, ranInt2, ranInt3
real :: ranReal
! This is a handy way to call INITGN and INRGCM for all generators,
! set the current generator to the first one, set the first generator
! to the given seeds, and the rest of the generators to seeds that
! will "continue" the sequence. In simple applications, this is
! generally used instead of SETSD. First arg in [1, 2147483562], and
! second arg in [1, 214748339]
call SETALL(11, 9)
! Set current generator to 2 (it is 1 by default) -- arg in [1,32]
call SETCGN(2)
! Query to see what generator we are using
call GETCGN(genNum)
write(*,*) 'Using generator number ', genNum
! Query to see what the seed is for current generator
call GETSD(seed1, seed2)
write (*,*) 'Seed after SETALL: ', seed1, seed2
! Set the seed for the current generator
! First arg in [1, 2147483562], and second arg in [1, 214748339]
call SETSD(11, 9)
! Query to see what the seed is for current generator
call GETSD(seed1, seed2)
write (*,*) 'Seed after SETSD: ', seed1, seed2
! Note gen 1 and 2 have the same seq -- we set the seeds the same.
write (*,*) 'Five random integers in U[1, 2147483562] from first three generators:'
do j=1,5
call SETCGN(1)
ranInt1 = IGNLGI()
call SETCGN(2)
ranInt2 = IGNLGI()
call SETCGN(3)
ranInt3 = IGNLGI()
write (*,*) j, ranInt1, ranInt2, ranInt3
end do
! Now get some uniform random reals
call SETCGN(1)
write (*,*) 'Five random reals in U(0,1) from generator 1:'
do j=1,5
ranReal = RANF()
write (*,*) j, ranReal
end do
! Lastly, we get some ranom reals from a normal distribution
call SETCGN(1)
write (*,*) 'Five random reals in N(1,0.0001) from generator 1:'
do j=1,5
ranReal = GENNOR(1.0, 0.0001)
write (*,*) j, ranReal
end do
end program ranlibEx
Generated by GNU Enscript 1.6.5.2.