37 lines
700 B
Go
37 lines
700 B
Go
package random
|
||
|
||
// Probability 输入一个概率,返回是否命中
|
||
// - 当 full 不为空时,将以 full 为基数,p 为分子,计算命中概率
|
||
func Probability(p int, full ...int) bool {
|
||
var f = 100
|
||
if len(full) > 0 {
|
||
f = full[0]
|
||
if f <= 0 {
|
||
f = 100
|
||
} else if p > f {
|
||
return true
|
||
}
|
||
}
|
||
r := Int(1, f)
|
||
return r <= p
|
||
}
|
||
|
||
// ProbabilityChooseOne 输入一组概率,返回命中的索引
|
||
func ProbabilityChooseOne(ps ...int) int {
|
||
var f int
|
||
for _, p := range ps {
|
||
f += p
|
||
}
|
||
if f <= 0 {
|
||
panic("total probability less than or equal to 0")
|
||
}
|
||
r := Int(1, f)
|
||
for i, p := range ps {
|
||
if r <= p {
|
||
return i
|
||
}
|
||
r -= p
|
||
}
|
||
panic("probability choose one error")
|
||
}
|