C++ 生成C+中具有固定和的随机值+;

C++ 生成C+中具有固定和的随机值+;,c++,random,C++,Random,我在网上看到了很多关于这个问题的答案,但是,你能相信我吗?我仍然没有找到这个问题的解决办法。我有一个值数组。此数组的大小为“n”。我还有定义值“sum”。我想要的是生成“n”个随机值,这样它们的和等于“和”,最好是均匀分布的,否则(例如)第一个随机数等于“和”,其余的等于零就没那么好了。我需要两个算法来完成这个任务。一个是正整数,一个是正浮点数。提前多谢 您可以生成n个正态分布的数字,然后将它们规格化为您的总和首先生成n个随机变量。然后总结:随机数。计算系数和/随机和。然后将所有随机变量乘以该系

我在网上看到了很多关于这个问题的答案,但是,你能相信我吗?我仍然没有找到这个问题的解决办法。我有一个值数组。此数组的大小为“n”。我还有定义值“sum”。我想要的是生成“n”个随机值,这样它们的和等于“和”,最好是均匀分布的,否则(例如)第一个随机数等于“和”,其余的等于零就没那么好了。我需要两个算法来完成这个任务。一个是正整数,一个是正浮点数。提前多谢

您可以生成n个正态分布的数字,然后将它们规格化为您的总和

首先生成n个随机变量。然后总结:随机数。计算系数和/随机和。然后将所有随机变量乘以该系数


整数会带来一个问题。。。四舍五入(可能)

您可以生成以下定义的n值:(Sum-sumofgeneratedvalue)/nnumberofgeneratedvalue)-+X(最大偏差X

示例

总和=100 N=5 +-十,


Rand介于100-0/5-0-->20+-10之间(因此介于10和30之间)

值1=17

兰特介于100-17/5-1--->21+-10之间(因此介于11和31之间)

。。。等


偏差会使你的随机数一致:)

你有一个循环,其中迭代次数等于你想要的随机数减1。对于第一次迭代,您会发现一个介于0和总和之间的随机数。然后从和中减去该随机数,在下一次迭代中,得到另一个随机数,并从子和减去上一次迭代中减去该随机数

在psuedocode中可能更容易

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
int和=10;
int n=5;//5个随机数之和等于和
int subSum=总和;
int[]随机数=新的int[n];
对于(int i=0;irandom(x,y)
获取介于
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;
int n=..;//你的意见
整数和=…..;//你的意见
int[]答案=新的int[n];
int-tmpsum=0;
对于(int i=0;isum?sum-tmpsum:random;
tmpsum+=int[i];
}
int[n-1]+=sum-tmpsum;

你的意思是你想让求和为
sum
n
值的每一个可能组合都以均匀分布的方式选择?你没有得到解决方案吗?(如果你的问题中包含了这个解决方案,这也会有帮助。)你希望n个值求和,但如果它们不是均匀分布的,那就是。。。还行,但不理想?这真的是你的要求吗?约瑟夫,是的,我想这就是我的意思。重点是。。假设sum=10,n=4。例如,好的随机值应该是3,3,3,1。如果我没有9,1,0,0,它们分布不均匀。。我希望我现在更清楚,因为将“均匀分布”的概念应用于价值观并不是那么容易…@Tarta这只是你的家庭作业吗?或者你正在实现一些功能吗?我忘了提那个。。我很抱歉。。我已经编辑了这个问题。。我还必须提供一个只包含无符号整数的算法版本。@Tarta那么呢?这不会产生负数,是吗?实际上我比我更喜欢这个答案是的,但系数可能不是整数。。负数没关系。但对于整数来说不合适。因为我已经写了,很抱歉我现在才提供了更多的信息。我真的反对你用你的宽限期来抄袭我这么大一部分的答案,让它看起来像是我抄袭了你的真命天子?我在你发布答案之前发布了我的答案?谁在抄袭?你只是碰巧也用c风格编写了你的伪代码,并称之为伪代码?C++甚至使用不同的数组语法。别误会,我真的不介意,但你可以注意到,不要让我看起来像一只复制猫。这会导致第一个元素的平均值变大,最后一个元素的平均值接近零。尽管你可以通过在生成数字后扰乱顺序来解决这个问题。nl-x,但我发誓,在你发布答案之前,我已经编写了伪代码。我是一个C开发者,但是这个代码应该在C++中工作,只要我知道我没有错,这不保证在所有情况下都能达到<代码>和> />代码。@ NISPIO OOP,当我写这个的时候,我实际上早删除了一段代码:…谢谢你注意到了。我已经编辑了我的答案