Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import math
- import random
- def poisson_point_probability(k: int, lambda_: float) -> float:
- return math.e**(-lambda_)*lambda_**k/math.factorial(k)
- def accum_poisson_probability_distribution(lambda_: float, cutoff_prob_error = 0.000_000_01) -> list[tuple]:
- F_x = [(0, poisson_point_probability(0, lambda_))]
- while F_x[-1][1] < 1 - cutoff_prob_error:
- F_x.append((len(F_x), F_x[-1][1] + poisson_point_probability(len(F_x), lambda_)))
- F_x[-1] = (F_x[-1][0] - 1, 1)
- return F_x
- def single_experiment(accum_probability_distribution: list[tuple]) -> int:
- uniform_random_value = random.random()
- i = 0
- while accum_probability_distribution[i][1] < uniform_random_value:
- i += 1
- return accum_probability_distribution[i][0]
- def n_experiments(accum_probability_distribution: list[tuple], n: int = 1) -> list:
- return [single_experiment(accum_probability_distribution) for _ in range(n)]
- if __name__ == "__main__":
- lambda_ = 10
- n = 1_000_000
- poisson_distribution = accum_poisson_probability_distribution(lambda_)
- results = n_experiments(poisson_distribution, n)
- expected_value = sum(results)/n
- variance = sum([(value - expected_value)**2 for value in results])/n
- print(expected_value, variance) # 10.008362 10.017930076999944; exec. time (user + sys) 0m1,232s + 0m0,024s
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement