"""
Simple acceptance-rejectance algorithm for generating Poisson random variable by Donald Knuth
see https://en.wikipedia.org/wiki/Poisson_distribution#Generating_Poisson-distributed_random_variables
"""
import numpy as np
from ..uniform import Uniform
from ...sampling import Sampling
[docs]class Knuth(Sampling):
"""Knuth algorithm for generating Poisson random variable"""
[docs] def __init__(self, lam: int):
super().__init__()
self.lam = lam
self._L = np.exp(-lam)
self._U = Uniform()
[docs] def cost(self):
return self._U.cost
[docs] def reset_sampling_cost(self):
self._U.reset_sampling_cost()
[docs] def sample_one(self):
k = 0
p = 1
sampling_u = self._U.sample
while p > self._L:
k += 1
p *= sampling_u()
return k - 1
[docs] def sample(self, size: int = 1):
res = np.array([self.sample_one() for _ in range(size)])
return res