设计思路:指定一个从0开始的自然数范围,让不同的概率分别占有一定的比例,然后使用均匀的随机数打中该范围即可。
package main
import (
"fmt"
"math/rand"
)
func main() {
// 设定概率: A:10%, B:20%, C:30%, D:40%
rateList := make(map[uint32]int32)
rateList[0] = 10
rateList[1] = 20
rateList[2] = 30
rateList[3] = 40
// 累计记录命中次数,200000000次循环
counterList := make([]int, 4)
for x := 0; x < 200000000; x++ {
randNum := rand.Int31n(99)
min, max := int32(0), int32(0)
// 查看命中情况
for k, span := range rateList {
max = min + span - 1
if randNum >= min && randNum <= max {
counterList[k]++
break
}
min += span // 进入下一范围
}
}
for _, b := range counterList {
fmt.Print(float32(b)/2000000, " ")
}
}