]> granicus.if.org Git - python/commitdiff
SF bug 130030: Claim of bad betavariate algorithm.
authorTim Peters <tim.peters@gmail.com>
Fri, 26 Jan 2001 06:49:56 +0000 (06:49 +0000)
committerTim Peters <tim.peters@gmail.com>
Fri, 26 Jan 2001 06:49:56 +0000 (06:49 +0000)
Lib/random.py
Misc/ACKS

index d098d393cd5f6ffdcd9ce43d4cd84475d8533c96..a22449cfe69eb1af8e1fc5bb93da010ade8ab222 100644 (file)
@@ -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 --------------------
 
index 753cc77ba8da1d215d6216e4fe7f1dbc3246b13e..95685475af525891c7f2708b501834f0f012bd9f 100644 (file)
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -118,7 +118,7 @@ Sebastian Fernandez
 Nils Fischbeck
 Doug Fort
 Robin Friedrich
-Ivan Frohe
+Ivan Frohne
 Jim Fulton
 Geoff Furnish
 Tadayoshi Funaba
@@ -338,6 +338,7 @@ Joel Shprentz
 Eric Siegerman
 Paul Sijben
 Nathan Paul Simons
+Janne Sinkkonen
 George Sipe
 Kragen Sitaker
 Rafal Smotrzyk