在网上扒了好久也没有想要的正态分布生产器,干脆参考网上的例子自己做个吧!
正态分布公式
1 2 3 4 5 6 | //正态分布公式 func NormalFloat64(x int64, miu int64, sigma int64) float64 {<!-- --> randomNormal := 1 / (math.Sqrt(2*math.Pi) * float64(sigma)) * math.Pow(math.E, -math.Pow(float64(x-miu), 2)/(2*math.Pow(float64(sigma), 2))) //注意下是x-miu,我看网上好多写的是miu-miu是不对的 return randomNormal } |
正态分布随机数生产器:参数啰嗦一下期望值miu是自己想在那个值周围徘徊,方差sigma是更集中还是更分散(我都是百度的,希望在这不懂得小朋友不用百度了)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | //正态分布随机数生产器:min:最小值,max:最大值,miu:期望值(均值),sigma:方差 func RandomNormalInt64(min int64, max int64, miu int64, sigma int64) (bool, int64) {<!-- --> if min >= max {<!-- --> return false, 0 } if miu < min {<!-- --> miu = min } if miu > max {<!-- --> miu = max } var x int64 var y, dScope float64 for {<!-- --> x = RandFromRangeInt64(min, max) y = NormalFloat64(x, miu, sigma) * 100000 dScope = float64(RandFromRangeInt64(0, int64(NormalFloat64(miu, miu, sigma)*100000))) //注意下传的是两个miu if dScope <= y {<!-- --> break } } return true, x } |
直接调用RandomNormalInt64函数就行了,返回个随机数
下面是我自己的测试代码,生成100个看看是不是自己想要的
1 2 3 4 5 6 7 8 9 10 11 | var testData = []int64{<!-- -->} for i := 1; i < 100; i++ {<!-- --> xx := RandomNormalInt64(1, 100, 80, 10) testData = append(testData, xx) } var sum int64 = 0 for _, v := range testData {<!-- --> sum += v } println("平均值:", int64(sum)/int64(len(testData))) |
刚接触go,写得不好的地方大佬多多指教,只是做个笔记,大佬勿喷!
#食色性也,为何罚我#