1

合計が 100 になる 4 つの乱数を生成する必要があります。これらの数字は 1 から 100 の範囲内である必要があります。

これどうやってするの?

4

6 に答える 6

5

たとえば、範囲 0..100 で 4 つの乱数を生成し、合計が 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) から 2 番目の乱数を生成します。

次に、範囲 1..(99-(first+last)) から 3 番目の乱数を生成します。

最後に最後の数字を 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 つ目、1 と 100-first-2 の間の 2 つ目、1 と 100-(first+second)-1 の間の 3 つ目、および 4 つ目 = 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 に答える