2

興味深い質問です。誰かが Java でこれを行う方法を知っていることを願っています。以下が成り立つように、整数 x1、x2、...、xn の合計で表現したい固定整数値 x があります。

x = x1 + x2 + ... + xn;

たとえば、n=3、x=10 とします。

10 = 5 + 3 + 2;

問題は、x1、x2、... xn の共有は均一に分散する必要があり、値 x を異なる共有に「分割」するたびに、それらは異なる必要があるということです。

誰でもどうすればいいのか考えていますか?

ありがとう、パトリック

4

3 に答える 3

2

これは機能します。アイデアは、最大キャップ x - (n -i) を持つ乱数を取得することです。つまり、次の数値がゼロになるのを避けるために、最初の要素を 8 に制限する必要があります。合計が x である正の数が必要であると想定しています。

Random random = new Random(System.currentTimeMillis());        
for (int i = 0; i < n -1; i++) {
   int j = random.nextInt(x - (n -i)) + 1;
   System.out.println(j);
   x -= j;
}
System.out.println(x);
于 2012-12-05T10:07:26.077 に答える
0

テストされておらず、おそらくあまり効率的ではありませんが、動作するはずです:

public static int[] sumNumbers(int number, int parts) {
    int[] result = new int[parts];
    int sum = 0;
    Random random = new Random();
    for (int i = 1; i < result.length; i++) {
        // here is the uneffecient part:
        int rand = random.nextInt(number);
        if (sum + rand < number) {
            result[i] = rand;
            sum += rand;
        } else {
            i--;
        }
    }
    result[0] = number - sum;
    return result;
}

次のケースが考えられるため、非効率的である可能性があります: 100 を 25 の数字に分割しています。ランダムに選択された最初の 5 つの数字の合計が 100 に近いとします。残りの 20 の数字がランダムに非常に小さくなるまで待つ必要があります。

于 2012-12-05T10:03:15.143 に答える