如何生成总计100的随机数?

时间:2013-02-26 11:46:14

标签: c++

我需要制作四个随机生成的数字,其总和必须为100.这些数字必须在1到100之间。

我该怎么做?

6 个答案:

答案 0 :(得分:5)

你可以生成四个随机数,例如在0..100的范围内,然后将它们重新缩放为100:

x_i' = 1 + x_i*96.0/sum

此解决方案无法提供{x_i}的均匀分布。

@PeterWood找到了这个问题的更好答案Random numbers that add to 100: Matlab

答案 1 :(得分:3)

从范围1..97生成第一个随机数。

然后从范围1 ..(98-first)

生成第二个随机数

然后从范围1中生成第三个随机数..(99-(第一个+最后一个))

最后将最后一个数字设为100 - (第一个+第二个+第三个)

答案 2 :(得分:3)

如果你需要的是[1,100]范围内的整数(显着衰减到[1,97]):

double x1 = random(0, 1); 
double x2 = random(0, 1); 
double x3 = random(0, 1); 
double x4 = random(0, 1); 

double sum = x1+x2+x3+x4; 

int n1 = 1 + x1*96.0/sum; 
int n2 = 1 + x2*96.0/sum; 
int n3 = 1 + x3*96.0/sum; 

int n4 = 100 - n1 - n2 -n3;

答案 3 :(得分:2)

生成1和100-3之间的第一个,第一个在1和100个第一个2之间,第三个在1和100-(第一个+第二个)-1之间,第四个= 100-(第一个+第二个+第三个)

答案 4 :(得分:0)

问题描述中没有任何内容表明每个数字必须在1到100的范围内。您可以在每次传递时改变mod。类似的东西:

int sum = 0;
std::vector<int> randomNums();
while (sum != 100) {
    const int randomNum = std::rand() % (99 - sum);
    sum += randomNum
    randomNums.push_back(randomNum);
}

答案 5 :(得分:0)

Already answered above, but if anyone is looking for a working example to copy and try quickly:

int main()
{
std::vector<int> v1;

int randNum1 = rand()%(97) + 1;
int randNum2 = rand()%(98-randNum1) +1;
int randNum3 = rand()%(99 - (randNum1+randNum2)) +1;
int randNum4 = 100 -(randNum1+randNum2+randNum);

v1.push_back(randNum1);
v1.push_back(randNum2);
v1.push_back(randNum3);
v1.push_back(randNum4);

int sum = 0;
for(const auto &itr : v1)
{
    cout << itr <<endl;
    sum =sum+itr;
}
cout << "sum is : " << sum <<endl;

return 0;

}