1! { dg-do compile }
2
3module general_rand
4  implicit none
5  private
6
7  integer, public, parameter :: GNDP = kind(1.0d0)
8
9  real(kind = GNDP), save :: &
10    gnc = 362436.0 / 16777216.0, &
11    gncd = 7654321.0 / 16777216.0, &
12    gncm = 16777213.0 / 16777216.0
13  integer, save :: &
14    gni97 = 97, &
15    gnj97 = 33
16
17  real(kind = GNDP), save :: gnu(97)
18
19contains
20  subroutine gn_fatal(message)
21    character(len = *), intent(in) :: message
22
23    stop 1
24  end subroutine gn_fatal
25
26  function gn_monte_rand(min, max) result(monte)
27    real(kind = GNDP), intent(in) :: min
28    real(kind = GNDP), intent(in) :: max
29    real(kind = GNDP) :: monte
30
31    real :: monte_temp
32
33    if (min > max) then
34      call gn_fatal('gn_monte_rand: min > max')
35    else if (min == max) then
36      call gn_fatal('gn_monte_rand: min = max: returning min')
37      monte_temp = min
38    else
39
40      monte_temp = gnu(gni97) - gnu(gnj97)
41      if (monte_temp < 0.0) then
42        monte_temp = monte_temp + 1.0
43      end if
44
45      gnu(gni97) = monte_temp
46      gni97 = gni97 - 1
47      if (gni97 == 0) then
48        gni97 = 97
49      end if
50    end if
51
52    monte = min + monte_temp * (max - min)
53
54  end function gn_monte_rand
55
56end module general_rand
57