poisson Function

private function poisson(self, lambda) result(rr)

Return Poisson random variate with rate lambda. Works well for lambda < 30 or so. For lambda >> 1 it can produce wrong results due to roundoff error.

Type Bound

rng_t

Arguments

Type IntentOptional Attributes Name
class(rng_t), intent(inout) :: self
real(kind=dp), intent(in) :: lambda

Return Value integer(kind=i4)


Calls

proc~~poisson~~CallsGraph proc~poisson rng_t%poisson proc~unif_01 rng_t%unif_01 proc~poisson->proc~unif_01 proc~next rng_t%next proc~unif_01->proc~next proc~rotl rotl proc~next->proc~rotl

Source Code

  function poisson(self, lambda) result(rr)
    class(rng_t), intent(inout) :: self
    real(dp), intent(in)        :: lambda
    integer(i4)                 :: rr
    real(dp)                    :: expl, p

    expl = exp(-lambda)
    rr   = 0
    p    = self%unif_01()

    do while (p > expl)
       rr = rr + 1
       p = p * self%unif_01()
    end do
  end function poisson