考虑到我需要一个n大小的矢量,其中每个元素都定义在[-1,1]之间。元素a [i]是由-1 + 2 * rand()生成的浮点数。我需要一种优雅的方法来确保数组元素的总和等于零。
我发现了两种可能的解决方案:
第一个是这个matlab函数https://www.mathworks.com/matlabcentral/fileexchange/9700-random-vectors-with-fixed-sum。它在R中也有一个实现,但是在C上实现它的工作量很大,因为此函数用于2d数组。
此线程在此处提供第二个值:在C ++中生成具有固定总和的随机值。本质上,这个想法是生成具有正态分布的n个数字,然后用我的总和将它们归一化。(我已经使用python波纹管实现了它),向量总计为1.0。它适用于除零以外的每个和值。
import random as rd
mySum = 1;
randomVector = []
randomSum = 0
for i in range(7):
randomNumber = -1 + 2*rd.random()
randomVector.append(randomNumber)
randomSum += randomNumber
coef = mySum/randomSum
myNewList = [j * coef for j in randomVector]
newsum = sum(myNewList)
Run Code Online (Sandbox Code Playgroud)
那么,有没有办法使用C或C ++做到这一点?如果您知道已经实现的功能,那就太好了。谢谢。
我编写了一个函数,该函数需要一个很长的long值n,并将其用作要经过的迭代次数。该函数应该可以很好地估计pi,但是,大的所有值都n趋向于3.000,而不是3.1415,所以我不确定发生了什么?
我做错了什么吗?
这是我的代码:
double estimate_pi(long long n){
double randomx, randomy, equation, pi;
long long i, incircle = 0;
for(i = 0; i < n; i++){
randomx = (double)(rand() % (1+1-0) + 0);
randomy = (double)(rand() % (1+1-0) + 0);
equation = randomx * randomx + randomy * randomy;
if(equation <= 1){
incircle++;
}
}
pi = (long double)4 * (long double)incircle / (long double)n;
return pi;
}
Run Code Online (Sandbox Code Playgroud)
在主函数中,打印pi的10个值:
int main(void){
long long N;
double pi_approx;
int …Run Code Online (Sandbox Code Playgroud)