在C ++中使用固定总和生成随机值

时间:2014-06-04 16:44:48

标签: c++ random

我在网上看到了很多关于这个问题的答案但是,你能相信我吗?我仍然无法解决这个问题。我有一系列的价值观。这个数组的大小是" n"。我还有定义的值" sum"。我想要的是生成" n"随机值,其总和等于" sum",最好是均匀分布,否则(例如)第一个随机数等于" sum"其余等于零并不是那么好。我需要两种算法来完成这项任务。一个具有正整数,一个具有正浮动。非常感谢提前!

5 个答案:

答案 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获取yrandom(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;