arrays - 如何在 go-lang 中创建一组正态分布的数字,围绕特定数字设置

标签 arrays math go statistics

在 Go 中创建正态分布的数字集可以按如下方式完成。

func getNormDistro(x int){
    for i := 0; i < x; i++{
        fmt.Print("   ",int(normalInverse(80,10)), "   ")
    }
}

func normalInverse(mu float32, sigma float32)(float32){
    return float32(rand.NormFloat64() * float64(sigma) + float64(mu))
}

运行这个:

getNormDistro(10)

打印这个:

   86      74      79      94      73      92      66      77      74      78    

唯一的问题是分布不一致并且具有随机性。这意味着生成的曲线可能不会尽可能接近正态分布曲线。

如何以一种算法方式创建一个尽可能遵循正态分布且输出中没有随机成分的函数?

所以,我知道这是可能的,因为您可以在 Excel 中轻松完成。 Excel 具有此函数 =NORMINV(E3,C3,D3),它采用 3 个周长出现的 % 机会(以小数形式)、分布的平均值和标准差。此函数返回的百分比机会值是进入。

如果您以 0.5 的特定均值和标准差迭代发生的百分比机会,您将得到您的均值,如果您的迭代均匀分布在 0% 和 100% 之间,则将生成一个没有随机成分的标准分布。

    Data Set    Mean    Standard Deviation  % Chance
56.73652126 80  10  0.01
56.73652126 80  10  0.02
61.19206392 80  10  0.03
62.49313929 80  10  0.04
63.55146373 80  10  0.05
64.45226405 80  10  0.06
65.24208972 80  10  0.07
65.9492844  80  10  0.08
66.59244966 80  10  0.09
67.18448434 80  10  0.1
67.7347188  80  10  0.11
68.25013208 80  10  0.12
68.73608871 80  10  0.13
69.19680659 80  10  0.14
69.63566611 80  10  0.15
70.05542117 80  10  0.16
70.45834747 80  10  0.17
70.84634912 80  10  0.18
71.22103705 80  10  0.19
71.58378766 80  10  0.2
71.93578753 80  10  0.21
72.27806786 80  10  0.22
72.61153151 80  10  0.23
72.93697437 80  10  0.24
73.2551025  80  10  0.25
73.56654595 80  10  0.26
73.87187009 80  10  0.27
74.17158493 80  10  0.28
74.4661528  80  10  0.29
74.75599487 80  10  0.3
75.04149653 80  10  0.31
75.32301201 80  10  0.32
75.60086834 80  10  0.33
75.87536871 80  10  0.34
76.14679534 80  10  0.35
76.41541207 80  10  0.36
76.68146654 80  10  0.37
76.94519212 80  10  0.38
77.20680966 80  10  0.39
77.46652897 80  10  0.4
77.72455023 80  10  0.41
77.98106521 80  10  0.42
78.23625835 80  10  0.43
78.49030785 80  10  0.44
78.74338653 80  10  0.45
78.99566279 80  10  0.46
79.24730138 80  10  0.47
79.49846417 80  10  0.48
79.74931092 80  10  0.49
80  80  10  0.5
80.25068908 80  10  0.51
80.50153583 80  10  0.52
80.75269862 80  10  0.53
81.00433721 80  10  0.54
81.25661347 80  10  0.55
81.50969215 80  10  0.56
81.76374165 80  10  0.57
82.01893479 80  10  0.58
82.27544977 80  10  0.59
82.53347103 80  10  0.6
82.79319034 80  10  0.61
83.05480788 80  10  0.62
83.31853346 80  10  0.63
83.58458793 80  10  0.64
83.85320466 80  10  0.65
84.12463129 80  10  0.66
84.39913166 80  10  0.67
84.67698799 80  10  0.68
84.95850347 80  10  0.69
85.24400513 80  10  0.7
85.5338472  80  10  0.71
85.82841507 80  10  0.72
86.12812991 80  10  0.73
86.43345405 80  10  0.74
86.7448975  80  10  0.75
87.06302563 80  10  0.76
87.38846849 80  10  0.77
87.72193214 80  10  0.78
88.06421247 80  10  0.79
88.41621234 80  10  0.8
88.77896295 80  10  0.81
89.15365088 80  10  0.82
89.54165253 80  10  0.83
89.94457883 80  10  0.84
90.36433389 80  10  0.85
90.80319341 80  10  0.86
91.26391129 80  10  0.87
91.74986792 80  10  0.88
92.2652812  80  10  0.89
92.81551566 80  10  0.9
93.40755034 80  10  0.91
94.0507156  80  10  0.92
94.75791028 80  10  0.93
95.54773595 80  10  0.94
96.44853627 80  10  0.95
97.50686071 80  10  0.96
98.80793608 80  10  0.97
100.5374891 80  10  0.98
103.2634787 80  10  0.99
110.9023231 80  10  0.999
117.1901649 80  10  0.9999
122.6489079 80  10  0.99999
127.5342431 80  10  0.999999
49.09767694 80  10  0.001
42.80983515 80  10  0.0001
37.35109206 80  10  0.00001
32.46575691 80  10  0.000001
28.00662418 80  10  0.0000001
23.87998756 80  10  0.00000001

最佳答案

随机 distribution 的数学描述通常是通过它的 probability distribution function 。对于像正态分布这样的连续分布,要么表示为 probability density function (您可能知道的 bell-shaped curve ),要么表示为 cumulative distribution function ,即 integral 。所以也许你想计算 that function

另一方面,您在实现和引用的 Excel function 中使用的术语表明您实际上正在寻找 inverse operation :给定概率,找到其中的值累积概率函数达到该值。对于给定的概率,这被称为 quantile

不幸的是,正态分布有一个非常复杂的公式,很难计算。 Its quantile function 并不容易。因此,我建议您不要尝试正确计算,而是使用一些提供该功能的库。一些网络搜索表明:

https://godoc.org/gonum.org/v1/gonum/stat/distuv#Normal.Quantile

func (n Normal) Quantile(p float64) float64

Quantile returns the inverse of the cumulative probability distribution.

查看 the underlying implementation 表明我不想自己解决这个问题。另请注意,这将是一个近似值(看起来像 Padé approximants 的分段组合),乍一看我没有看到任何提及错误界限的内容。其他库可能有更好的近似值或更好的保证。

如果您确实想要遵循此分布的数字数组,请选择与 (0,1) 等距的概率(这可能意味着从 1/(n+1) 到 n/(n+1) 或 1/(2n), 3/(2n), … (2n−1)/(2n) 取决于应用或品味)并计算这些的分位数。如果你确实想要整数,可以随后四舍五入。但您可能还想检查 continuous distribution 是否适合您,或者使用像 discrete distribution 这样的 binomial distribution 是否会更好。

关于arrays - 如何在 go-lang 中创建一组正态分布的数字,围绕特定数字设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50843647/

相关文章:

golang 接受已经打开的 fd

go - 名称错误 : name 'go' is not defined in sublime text 3 console

parallel-processing - go是使用共享内存还是分布式计算

python - 在python中存储大量 bool 数据

javascript - 按区域调整图像大小

javascript - 复杂数学计算中的小数点舍入

algorithm - 如何从不平衡转换为平衡三元?

c - C 中的字符串文字以 %?

javascript - 如何按顺序对数组中的重复值求和

c++ - 如何使用包含大量数据的类元素处理 STL 容器