diff options
author | Tim Peters <tim.peters@gmail.com> | 2001-01-26 06:49:56 (GMT) |
---|---|---|
committer | Tim Peters <tim.peters@gmail.com> | 2001-01-26 06:49:56 (GMT) |
commit | 85e2e4742d0a1accecd02058a7907df36308297e (patch) | |
tree | 3ef4623379dca2e3ba68fbcb368f01c1073957f2 /Lib/random.py | |
parent | 2786543b705af6d7f091edcb66f1855488a6cb42 (diff) | |
download | cpython-85e2e4742d0a1accecd02058a7907df36308297e.zip cpython-85e2e4742d0a1accecd02058a7907df36308297e.tar.gz cpython-85e2e4742d0a1accecd02058a7907df36308297e.tar.bz2 |
SF bug 130030: Claim of bad betavariate algorithm.
Diffstat (limited to 'Lib/random.py')
-rw-r--r-- | Lib/random.py | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/Lib/random.py b/Lib/random.py index d098d39..a22449c 100644 --- a/Lib/random.py +++ b/Lib/random.py @@ -461,14 +461,27 @@ class Random: return mu + z*sigma ## -------------------- beta -------------------- +## See +## http://sourceforge.net/bugs/?func=detailbug&bug_id=130030&group_id=5470 +## for Ivan Frohne's insightful analysis of why the original implementation: +## +## def betavariate(self, alpha, beta): +## # Discrete Event Simulation in C, pp 87-88. +## +## y = self.expovariate(alpha) +## z = self.expovariate(1.0/beta) +## return z/(y+z) +## +## was dead wrong, and how it probably got that way. def betavariate(self, alpha, beta): - - # Discrete Event Simulation in C, pp 87-88. - - y = self.expovariate(alpha) - z = self.expovariate(1.0/beta) - return z/(y+z) + # This version due to Janne Sinkkonen, and matches all the std + # texts (e.g., Knuth Vol 2 Ed 3 pg 134 "the beta distribution"). + y = self.gammavariate(alpha, 1.) + if y == 0: + return 0.0 + else: + return y / (y + self.gammavariate(beta, 1.)) ## -------------------- Pareto -------------------- |