splitmix64_next_bernoulli_ppm Function

private function splitmix64_next_bernoulli_ppm(gen, ppm) result(r)

True with probability ppm in a million, from a splitmix64_t generator.

Arguments

Type IntentOptional Attributes Name
type(splitmix64_t), intent(inout) :: gen

Generator, advanced by the draw unless ppm is 0 or PPM_ONE.

integer(kind=default_int), intent(in) :: ppm

Probability in parts per million, clamped to [0, PPM_ONE].

Return Value logical


Calls

proc~~splitmix64_next_bernoulli_ppm~~CallsGraph proc~splitmix64_next_bernoulli_ppm splitmix64_next_bernoulli_ppm proc~splitmix64_uniform_below splitmix64_uniform_below proc~splitmix64_next_bernoulli_ppm->proc~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_next_bernoulli_ppm~~CalledByGraph proc~splitmix64_next_bernoulli_ppm splitmix64_next_bernoulli_ppm interface~next_bernoulli_ppm next_bernoulli_ppm interface~next_bernoulli_ppm->proc~splitmix64_next_bernoulli_ppm

Variables

Type Visibility Attributes Name Initial
integer(kind=default_int), private :: clamped

Source Code

   function splitmix64_next_bernoulli_ppm(gen, ppm) result(r)
      !! True with probability `ppm` in a million, from a splitmix64_t generator.
      type(splitmix64_t), intent(inout) :: gen
         !! Generator, advanced by the draw unless `ppm` is 0 or `PPM_ONE`.
      integer(default_int), intent(in) :: ppm
         !! Probability in parts per million, clamped to `[0, PPM_ONE]`.
      logical :: r

      integer(default_int) :: clamped

      clamped = max(0_default_int, min(PPM_ONE, ppm))
      if (clamped == 0_default_int) then
         r = .false.
         return
      end if
      if (clamped == PPM_ONE) then
         r = .true.
         return
      end if
      r = splitmix64_uniform_below(gen, int(PPM_ONE, int64) - 1_int64) < int(clamped, int64)
   end function splitmix64_next_bernoulli_ppm