22 use,
intrinsic :: iso_fortran_env
42 integer(int64),
parameter,
public :: &
43 splitmix64_123 = int(z
'B4DC9BD462DE412B', int64), &
57 integer(int64),
intent(inout) :: x
62 x = ieor(x, shiftl(x, 13))
63 x = ieor(x, shiftr(x, 7))
64 x = ieor(x, shiftl(x, 17))
78 integer(int64),
intent(in) :: x
80 real(real64),
parameter :: two_pow_minus_53 = real(z
'3CA0000000000000', real64)
82 d = real(shiftr(x, 11), real64) * two_pow_minus_53
88 integer(int64),
intent(inout) :: iseed
89 real(real64),
intent(out) :: rnd
100 integer(int64),
intent(inout) :: iseed
101 integer,
intent(in) :: nn
102 real(real64),
intent(inout) :: rnd(:)
106 push_sub(quickrnd_array)
112 pop_sub(quickrnd_array)
119 integer(int64),
intent(inout) :: iseed
120 integer,
intent(in) :: nn
121 complex(real64),
intent(inout) :: rnd(:)
123 real(real64),
parameter :: inv_sqrt2 = 1.0_real64 /
sqrt(
m_two)
124 real(real64) :: re, im
127 push_sub(quickrnd_array)
132 rnd(ii) = cmplx(re, im, real64) * inv_sqrt2
135 pop_sub(quickrnd_array)
142 integer(int64),
intent(inout) :: iseed
143 integer(int64),
intent(in) :: n
145 integer(int64) :: discard
163 integer(int32),
intent(inout) :: x
165 x = ieor(x, ishft(x, 13_int32))
166 x = ieor(x, ishft(x, -17_int32))
167 x = ieor(x, ishft(x, 5_int32))
171 x = iand(x, z
'7FFFFFFF')
178 real(real64),
intent(in ) :: x_min, x_max
179 integer(int32),
intent(inout) :: seed
182 real(real64),
parameter :: max_value_xorshift_32 = 2147483647_real64
183 real(real64) :: scale
186 scale = real(seed, real64) / max_value_xorshift_32
187 rand = scale * (x_max - x_min) + x_min
195 integer(int64),
intent(in ) :: x_min, x_max
196 integer(int64),
intent(inout) :: seed
197 integer(int64) :: rand
199 integer(int64) :: range
203 if (seed < 0_int64) seed = -seed
204 range = x_max - x_min + 1_int64
205 rand = x_min + mod(seed, range)
216 integer(int32),
intent(in ) :: m
217 integer(int64),
intent(in ) :: n
218 integer(int64),
intent(inout) :: seed
219 integer(int64),
intent( out) :: values(:)
221 integer(int64),
allocatable :: indices(:)
222 integer(int64) :: i, j, temp
226 safe_allocate(indices(1:n))
235 indices(i) = indices(j)
237 values(i) = indices(i)
240 values(m) = indices(m)
241 safe_deallocate_a(indices)
267 real(real64),
intent(in ) :: weight(:)
268 integer(int32),
intent(out) :: reservoir(:)
269 integer(int32),
intent(in ),
optional :: seed_value
273 real(real64) :: u_i, u_i2
275 real(real64),
allocatable :: key(:)
277 integer(int32) :: min_key_index, i, seed_size
278 integer(int32),
allocatable :: seed(:)
279 real(real64) :: thres_w
283 real(real64),
parameter :: a = 1.e-10_real64
284 real(real64),
parameter :: b = 1._real64 - 1.e-10_real64
293 if (
present(seed_value))
then
294 safe_allocate_source(seed(1:1), seed_value)
297 call random_seed(size=seed_size)
298 safe_allocate(seed(1:seed_size))
299 call random_seed(get=seed)
304 safe_allocate(key(1:m))
309 key(i) = u_i ** (1._real64 / weight(i))
310 if (key(i) < key(min_key_index)) min_key_index = i
314 xw =
log(u_i) /
log(key(min_key_index))
320 if (xw <= 0._real64)
then
321 reservoir(min_key_index) = i
322 thres_w = key(min_key_index)**weight(i)
325 key(min_key_index) = u_i2 ** (1._real64 / weight(i))
326 min_key_index = minloc(key, dim=1)
328 xw =
log(u_i) /
log(key(min_key_index))
333 safe_deallocate_a(key)
334 safe_deallocate_a(seed)
double log(double __x) __attribute__((__nothrow__
double sqrt(double __x) __attribute__((__nothrow__
real(real64), parameter, public m_two
subroutine dquickrnd_array(iseed, nn, rnd)
integer(int64), parameter, public splitmix64_321
subroutine, public reservoir_sampling_aexpj(weight, reservoir, seed_value)
Algorithm "A-ExpJ" weighted reservoir sampling without replacement.
subroutine, public shiftseed(iseed, n)
real(real64) function random_real_in_range(x_min, x_max, seed)
Generate a random real64 in the range .
integer(int64) function random_integer_in_range(x_min, x_max, seed)
Generate a random int64 in the range .
real(real64) function, private to_double(x)
Generating uniform doubles in the unit interval.
subroutine xorshift_rnd_32_biased(x)
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)
subroutine zquickrnd_array(iseed, nn, rnd)
integer(int64) function, private xorshift64(x)
xorshift64 pseudorandom number generator