我尝试生成0到1之间的N个随机浮点数,其中N是由用户指定的。然后我需要找出生成数字的均值和方差。努力寻找方差。
我已经尝试过使用变量而不是数组,但已经更改了我的代码以允许使用数组。
#include <cstdlib>
#include <ctime>
#include <cmath>
using namespace std;
int main(){
int N, i;
float random_numbers[i], sum, mean, variance, r;
cout << "Enter an N value" << endl;
cin >> N;
sum = 0;
variance = 0;
for (i = 0; i < N; i++) {
srand(i + 1);
random_numbers[i] = ((float) rand() / float(RAND_MAX));
sum += random_numbers[i];
cout << random_numbers[i] << endl;
mean= sum / N;
variance += pow(random_numbers[i]-mean,2);
}
variance = variance / N;
cout << " The sum of random numbers is " << sum << endl;
cout << " The mean is " << mean << endl;
cout << " The variance is " << variance << endl;
}
The mean and sum is currently correct however the variance is not.
发布于 2019-10-17 13:56:56
你在循环中计算的mean
是一个“运行平均值”,即对于每个新的传入数字,你都会计算到这一点的平均值。但是,对于方差,您的公式是不正确的。这一点:
variance += pow(random_numbers[i]-mean,2);
如果mean
是最终值,那么它将是正确的,但由于它是移动平均值,方差的结果是不正确的。你基本上有两个选择。您要么使用正确的公式(搜索“方差单次通过算法”或“运行方差”),要么首先计算平均值,然后设置第二个循环来计算方差(在这种情况下,您的公式是正确的)。
请注意,方差的单遍算法在数值上不像使用两个循环那样稳定,因此,如果您能够负担得起内存和性能,您应该首选使用两遍的算法。
PS:你的代码还有其他问题,但我集中在你的主要问题上。
发布于 2019-10-17 13:55:53
在方差计算中使用的平均值只是第一个to i元素的平均值。你应该先计算样本的平均值,然后再做另一个循环来计算方差。
尽情享受
https://stackoverflow.com/questions/58434294
复制