在网上扒了好久也没有想要的正态分布生产器,干脆参考网上的例子自己做个吧!

正态分布公式

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,写得不好的地方大佬多多指教,只是做个笔记,大佬勿喷!
#食色性也,为何罚我#