43 lines
1.0 KiB
Go
43 lines
1.0 KiB
Go
package stats
|
|
|
|
import (
|
|
"math"
|
|
)
|
|
|
|
// ProbGeom generates the probability for a geometric random variable
|
|
// with parameter p to achieve success in the interval of [a, b] trials
|
|
// See https://en.wikipedia.org/wiki/Geometric_distribution for more information
|
|
func ProbGeom(a int, b int, p float64) (prob float64, err error) {
|
|
if (a > b) || (a < 1) {
|
|
return math.NaN(), ErrBounds
|
|
}
|
|
|
|
prob = 0
|
|
q := 1 - p // probability of failure
|
|
|
|
for k := a + 1; k <= b; k++ {
|
|
prob = prob + p*math.Pow(q, float64(k-1))
|
|
}
|
|
|
|
return prob, nil
|
|
}
|
|
|
|
// ProbGeom generates the expectation or average number of trials
|
|
// for a geometric random variable with parameter p
|
|
func ExpGeom(p float64) (exp float64, err error) {
|
|
if (p > 1) || (p < 0) {
|
|
return math.NaN(), ErrNegative
|
|
}
|
|
|
|
return 1 / p, nil
|
|
}
|
|
|
|
// ProbGeom generates the variance for number for a
|
|
// geometric random variable with parameter p
|
|
func VarGeom(p float64) (exp float64, err error) {
|
|
if (p > 1) || (p < 0) {
|
|
return math.NaN(), ErrNegative
|
|
}
|
|
return (1 - p) / math.Pow(p, 2), nil
|
|
}
|