我在网上看到了很多关于这个问题的答案但是,你能相信我吗?我仍然无法解决这个问题。我有一系列的价值观。这个数组的大小是" n"。我还有定义的值" sum"。我想要的是生成" n"随机值,其总和等于" sum",最好是均匀分布,否则(例如)第一个随机数等于" sum"其余等于零并不是那么好。我需要两种算法来完成这项任务。一个具有正整数,一个具有正浮动。非常感谢提前!
答案 0 :(得分:4)
首先生成n个随机变量。然后总结一下:randomSum。计算系数sum / randomSum。然后将所有随机变量乘以该系数。
整数会造成问题......也可能是圆形(可能)
答案 1 :(得分:1)
您可以生成具有正态分布的n个数字,然后将它们标准化为您的总和
答案 2 :(得分:0)
您可以生成 n由此定义的值:(( Sum - sumOfGeneratedValues )/ n - ( numberOfGeneatedValue )) - + X ( X最大偏差)
示例:
SUM = 100 N = 5 + - 10
Rand在100 - 0/5 - 0 - >之间; 20 + -10(因此在10和30之间)
Value1 = 17;
兰德在100 - 17/5 - 1 --->之间21 + -10(11到31之间)
...等
偏差会让你的随机统一 :)
答案 3 :(得分:0)
你有一个循环,其中迭代次数等于你想要的随机数减去1.对于第一次迭代,你会发现一个介于0和总和之间的随机数。然后从总和中减去该随机数,并在下一次迭代中得到另一个随机数,并从子总和减去最后一次迭代中减去
在伪代码中可能更容易
int sum = 10;
int n = 5; // 5 random numbers summed to equal sum
int subSum = sum;
int[] randomNumbers = new int[n];
for(int i = 0; i < n - 2; i++)
{
randomNumbers[i] = rand(0, subSum); // get random number between 0 and subSum
subSum -= randomNumbers[i];
}
randomNumbers[n - 1] = subSum; // leftovers go to the last random number
答案 4 :(得分:0)
我的C ++非常(非常非常)生锈。因此,假设您已经知道如何使用函数x
获取y
和random(x,y)
之间的随机数。然后这里是一些其他c派生语言的伪代码:
int n = ....; // your input
int sum = ....; // your input
int[] answer = new int[n];
int tmpsum = 0;
for (int i=0; i < n; i++) {
int exactpart = sum/n;
int random = (exactpart/2) + random(0,exactpart);
int[i] = tmpsum + random > sum ? sum - tmpsum : random;
tmpsum += int[i];
}
int[n-1] += sum - tmpsum;