@@ -89,8 +89,8 @@ where F: Float + FloatConst, Standard: Distribution<F>
8989
9090 // for low expected values use the Knuth method
9191 if self . lambda < F :: from ( 12.0 ) . unwrap ( ) {
92- let mut result = F :: zero ( ) ;
93- let mut p = F :: one ( ) ;
92+ let mut result = F :: one ( ) ;
93+ let mut p = rng . gen :: < F > ( ) ;
9494 while p > self . exp_lambda {
9595 p = p* rng. gen :: < F > ( ) ;
9696 result = result + F :: one ( ) ;
@@ -161,10 +161,15 @@ mod test {
161161
162162 #[ test]
163163 fn test_poisson_avg ( ) {
164- test_poisson_avg_gen :: < f64 > ( 10.0 , 0.5 ) ;
165- test_poisson_avg_gen :: < f64 > ( 15.0 , 0.5 ) ;
166- test_poisson_avg_gen :: < f32 > ( 10.0 , 0.5 ) ;
167- test_poisson_avg_gen :: < f32 > ( 15.0 , 0.5 ) ;
164+ test_poisson_avg_gen :: < f64 > ( 10.0 , 0.1 ) ;
165+ test_poisson_avg_gen :: < f64 > ( 15.0 , 0.1 ) ;
166+
167+ test_poisson_avg_gen :: < f32 > ( 10.0 , 0.1 ) ;
168+ test_poisson_avg_gen :: < f32 > ( 15.0 , 0.1 ) ;
169+
170+ //Small lambda will use Knuth's method with exp_lambda == 1.0
171+ test_poisson_avg_gen :: < f32 > ( 0.00000000000000005 , 0.1 ) ;
172+ test_poisson_avg_gen :: < f64 > ( 0.00000000000000005 , 0.1 ) ;
168173 }
169174
170175 #[ test]
0 commit comments