找到任何长度为N且标准偏差为K的数组

时间:2017-11-05 17:23:28

标签: statistics computer-science standard-deviation variance

在ACM ICPC 2018预赛中提出了这个问题。您必须打印任何长度 N 的数组,其标准差为K。

1 个答案:

答案 0 :(得分:0)

你没有提到对数据类型的约束,所以我假设你对浮点结果没问题(另一种方法是你想要只有整数的解决方案,如果这是意图,那么下面的内容严重不足之处任务。)

在实际情况下,我们希望给定一个长度为n-1且标准差为k'的数组,我们应该能够得到一个长度为n的数组,其标准偏差为{{1}通过向较短的数组添加一些元素。也就是说,通过调整新元素,我们可以连续扫描从k > k'开始并继续上去的所有值。

通过这种观察,我们可能会猜测我们可以从任何名义数组开始 - 比如k长度为[0, 0, ..., 0],并添加一些元素以使标准偏差“出来”正确。让我们调用要添加的值n - 1。这种数组的意思是:

v

方差如下:

m = (0 + 0 + ... + 0 + v) / n = v/n

我们可以在表达式中替换均值:

s^2 = [(0-m)^2 + (0-m)^2 + ... + (0-m)^2 + (v-m)^2] / n

我们可以将s^2 = [(v/n)^2 + (v/n)^2 + ... + (v/n)^2 + (v-v/n)^2] / n 术语分解为:

v^2

我们可以用乘法代替重复加法:

s^2 = v^2[(1/n)^2 + ... + (1/n)^2 + (1-1/n)^2] / n

最后,我们可以求解s^2 = v^2 [(n-1)(1/n)^2 + (1-1/n)^2] / n 以查看我们添加到数组中的内容:

v

一些代数表明这简化为:

v = s / sqrt([(n-1)(1/n)^2 + (1-1/n)^2] / n)

回想一下,我们给了v = s * n / sqrt(n - 1) ,所以通过替换,我们可以确定s = k

v

生成的数组将包含v = k * n / sqrt(n - 1) 个零和一个n - 1

示例:v

k = 1, n = 10