Advertisement
Toumo

discrete_distribution_from_uniform.py

Apr 13th, 2023 (edited)
847
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.34 KB | None | 0 0
  1. import math
  2. import random
  3.  
  4. def poisson_point_probability(k: int, lambda_: float) -> float:
  5.     return math.e**(-lambda_)*lambda_**k/math.factorial(k)
  6.  
  7. def accum_poisson_probability_distribution(lambda_: float, cutoff_prob_error = 0.000_000_01) -> list[tuple]:
  8.     F_x = [(0, poisson_point_probability(0, lambda_))]
  9.     while F_x[-1][1] < 1 - cutoff_prob_error:
  10.         F_x.append((len(F_x), F_x[-1][1] + poisson_point_probability(len(F_x), lambda_)))
  11.     F_x[-1] = (F_x[-1][0] - 1, 1)
  12.     return F_x
  13.  
  14. def single_experiment(accum_probability_distribution: list[tuple]) -> int:
  15.     uniform_random_value = random.random()
  16.     i = 0
  17.     while accum_probability_distribution[i][1] < uniform_random_value:
  18.         i += 1
  19.     return accum_probability_distribution[i][0]
  20.  
  21. def n_experiments(accum_probability_distribution: list[tuple], n: int = 1) -> list:
  22.     return [single_experiment(accum_probability_distribution) for _ in range(n)]
  23.  
  24. if __name__ == "__main__":
  25.     lambda_ = 10
  26.     n = 1_000_000
  27.     poisson_distribution = accum_poisson_probability_distribution(lambda_)
  28.     results = n_experiments(poisson_distribution, n)
  29.     expected_value = sum(results)/n
  30.     variance = sum([(value - expected_value)**2 for value in results])/n
  31.     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