1

我需要生成四个随机生成的数字,总和必须为 100。这些数字必须在 1 到 100 的范围内。

我怎样才能做到这一点?

4

6 回答 6

5

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

x_i' = 1 + x_i*96.0/sum

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

@PeterWood 为这个问题找到了更好的答案随机数加到 100:Matlab

于 2013-02-26T11:55:31.657 回答
3

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

然后从范围 1..(98-first) 生成第二个随机数

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

最后将最后一个数字设置为 100 - (first+second+third)

于 2013-02-26T11:52:28.760 回答
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;
于 2013-02-26T11:58:49.447 回答
2

生成 1 到 100-3 之间的第一个,1 到 100-first-2 之间的第二个,1 到 100-(first+second)-1 之间的第三个,以及第四个 = 100-(first+second+third)。

于 2013-02-26T11:52:18.283 回答
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);
}
于 2013-02-27T12:18:50.343 回答
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;

}

于 2020-10-15T18:50:08.117 回答