22 use,
intrinsic :: iso_c_binding
23 use,
intrinsic :: iso_fortran_env
43 integer(int64),
parameter,
public :: &
44 splitmix64_123 = int(z
'B4DC9BD462DE412B', int64), &
54 use,
intrinsic :: iso_c_binding
55 integer(c_int64_t),
value,
intent(in) :: x
59 function splitmix64_mixer(x)
result(z) bind(C, name='splitmix64_mixer_2pow63')
60 use,
intrinsic :: iso_c_binding
61 integer(c_int64_t),
value,
intent(in) :: x
62 integer(c_int64_t) :: z
66 use,
intrinsic :: iso_c_binding
67 integer(c_int64_t),
intent(in) :: ids(*)
68 integer(c_int32_t),
value,
intent(in) :: n
69 integer(c_int64_t) :: s
80 integer(int64),
intent(inout) :: x
85 x = ieor(x, shiftl(x, 13))
86 x = ieor(x, shiftr(x, 7))
87 x = ieor(x, shiftl(x, 17))
101 integer(int64),
intent(in) :: x
103 real(real64),
parameter :: two_pow_minus_53 = real(z
'3CA0000000000000', real64)
105 d = real(shiftr(x, 11), real64) * two_pow_minus_53
111 integer(int64),
intent(inout) :: iseed
112 real(real64),
intent(out) :: rnd
123 integer(int64),
intent(inout) :: iseed
124 integer,
intent(in) :: nn
125 real(real64),
intent(inout) :: rnd(:)
129 push_sub(quickrnd_array)
135 pop_sub(quickrnd_array)
142 integer(int64),
intent(inout) :: iseed
143 integer,
intent(in) :: nn
144 complex(real64),
intent(inout) :: rnd(:)
146 real(real64),
parameter :: inv_sqrt2 = 1.0_real64 /
sqrt(
m_two)
147 real(real64) :: re, im
150 push_sub(quickrnd_array)
155 rnd(ii) = cmplx(re, im, real64) * inv_sqrt2
158 pop_sub(quickrnd_array)
165 integer(int64),
intent(inout) :: iseed
166 integer(int64),
intent(in) :: n
168 integer(int64) :: discard
193 integer(int64),
intent(in ) :: x_min, x_max
194 integer(int64),
intent(inout) :: seed
197 integer(int64) :: range
199 assert(seed /= 0_int64)
201 if (seed < 0_int64) seed = -seed
202 range = x_max - x_min + 1_int64
203 rand = x_min + mod(seed, range)
214 integer(int32),
intent(in ) :: m
215 integer(int64),
intent(in ) :: n
216 integer(int64),
intent(inout) :: seed
217 integer(int64),
intent( out) :: values(:)
219 integer(int64),
allocatable :: indices(:)
220 integer(int64) :: i, j, temp
224 safe_allocate(indices(1:n))
233 indices(i) = indices(j)
235 values(i) = indices(i)
238 values(m) = indices(m)
239 safe_deallocate_a(indices)
254 real(real64) function u01_from_ids(ids) result(u)
255 integer(int64),
intent(in) :: ids(:)
257 integer(int64) :: s, s_mixed
double sqrt(double __x) __attribute__((__nothrow__
real(real64), parameter, public m_two
subroutine dquickrnd_array(iseed, nn, rnd)
real(real64) function to_double(x)
Generating uniform doubles in the unit interval.
integer(int64), parameter, public splitmix64_321
subroutine, public shiftseed(iseed, n)
integer(int64) function random_integer_in_range(x_min, x_max, seed)
Generate a random int64 in the range .
real(real64) function, public u01_from_ids(ids)
Mix an integer array of ids to give a random number in the range U(0,1), which is deterministic w....
subroutine, public fisher_yates_shuffle(m, n, seed, values)
Return m random numbers from a range of with no replacement.
subroutine dquickrnd_single(iseed, rnd)
integer(int64) function xorshift64(x)
xorshift64 pseudorandom number generator
subroutine zquickrnd_array(iseed, nn, rnd)