RosettaCodeData/Task/Linear-congruential-generator/Fortran/linear-congruential-generator.f
2023-07-01 13:44:08 -04:00

42 lines
971 B
Fortran

module lcgs
implicit none
integer, parameter :: i64 = selected_int_kind(18)
integer, parameter :: a1 = 1103515245, a2 = 214013
integer, parameter :: c1 = 12345, c2 = 2531011
integer, parameter :: div = 65536
integer(i64), parameter :: m = 2147483648_i64 ! need to go to 64 bits because
! of the use of signed integers
contains
function bsdrand(seed)
integer :: bsdrand
integer, optional, intent(in) :: seed
integer(i64) :: x = 0
if(present(seed)) x = seed
x = mod(a1 * x + c1, m)
bsdrand = x
end function
function msrand(seed)
integer :: msrand
integer, optional, intent(in) :: seed
integer(i64) :: x = 0
if(present(seed)) x = seed
x = mod(a2 * x + c2, m)
msrand = x / div
end function
end module
program lcgtest
use lcgs
implicit none
integer :: i
write(*, "(a)") " BSD MS"
do i = 1, 10
write(*, "(2i12)") bsdrand(), msrand()
end do
end program