splitmix64_uniform_below Function

private function splitmix64_uniform_below(gen, span_minus_1) result(r)

Uniform unsigned integer in [0, span_minus_1], by rejection.

Arguments

Type IntentOptional Attributes Name
type(splitmix64_t), intent(inout) :: gen
integer(kind=int64), intent(in) :: span_minus_1

Inclusive upper bound, read as unsigned.

Return Value integer(kind=int64)


Calls

proc~~splitmix64_uniform_below~~CallsGraph proc~splitmix64_uniform_below splitmix64_uniform_below proc~rejection_mask~2 rejection_mask proc~splitmix64_uniform_below->proc~rejection_mask~2 proc~splitmix64_next_u64 splitmix64_t%splitmix64_next_u64 proc~splitmix64_uniform_below->proc~splitmix64_next_u64 proc~u64_less u64_less proc~splitmix64_uniform_below->proc~u64_less proc~u64_shr u64_shr proc~rejection_mask~2->proc~u64_shr proc~splitmix64_next splitmix64_t%splitmix64_next proc~splitmix64_next_u64->proc~splitmix64_next proc~mix64 mix64 proc~splitmix64_next->proc~mix64 proc~u64_add u64_add proc~splitmix64_next->proc~u64_add proc~mix64->proc~u64_shr proc~u64_mul u64_mul proc~mix64->proc~u64_mul

Called by

proc~~splitmix64_uniform_below~~CalledByGraph proc~splitmix64_uniform_below splitmix64_uniform_below proc~splitmix64_next_bernoulli_ppm splitmix64_next_bernoulli_ppm proc~splitmix64_next_bernoulli_ppm->proc~splitmix64_uniform_below proc~splitmix64_next_range splitmix64_next_range proc~splitmix64_next_range->proc~splitmix64_uniform_below interface~next_bernoulli_ppm next_bernoulli_ppm interface~next_bernoulli_ppm->proc~splitmix64_next_bernoulli_ppm interface~next_range next_range interface~next_range->proc~splitmix64_next_range

Variables

Type Visibility Attributes Name Initial
integer(kind=int64), private :: mask

Source Code

   function splitmix64_uniform_below(gen, span_minus_1) result(r)
      !! Uniform unsigned integer in `[0, span_minus_1]`, by rejection.
      type(splitmix64_t), intent(inout) :: gen
      integer(int64), intent(in) :: span_minus_1
         !! Inclusive upper bound, read as unsigned.
      integer(int64) :: r

      integer(int64) :: mask

      if (span_minus_1 == 0_int64) then
         r = 0_int64
         return
      end if
      mask = rejection_mask(span_minus_1)
      do
         r = iand(gen%next_u64(), mask)
         if (.not. u64_less(span_minus_1, r)) exit
      end do
   end function splitmix64_uniform_below