如何将大的正整数 n 均匀地随机分为部分。
后置条件:将所有部分加起来,应得到

下面是我的尝试(在Java中像伪代码一样),但是我认为它不会给我统一的随机分布。
我首先通过除以n / m来找到平均部分平均数。然后,我生成m-1个随机数,其大小在平均值左右(通过交替生成0和avg之间以及* avg和2 * avg *之间的随机数。然后我从原始数中减去这些m-1个数的总和n并将其设置为第m部分。

假设函数rand(x,y)在x和y之间均匀地返回一个随机数。

int[] divideUniformlyRandomly(int n, int m)
{
    int[] res = new int[m];
    int avg = n / m;
    int sum = 0;
    bool alternator = false;
    for(int i = 0; i < m - 1; i++)
    {
        if(alternator == false)
        {
            res[i] = rand(0, avg);
            alternator = true;
        }
        else
        {
            res[i] = rand(avg, 2*avg);
            alternator = false;
        }
        sum += res[i];
    }
    res[m-1] = n - sum;
    return res;
}

最佳答案

public double[] divideUniformlyRandomly(double number, int part) {
    double uniformRandoms[] = new double[part];
    Random random = new Random();

    double mean = number / part;
    double sum = 0.0;

    for (int i=0; i<part / 2; i++) {
        uniformRandoms[i] = random.nextDouble() * mean;

        uniformRandoms[part - i - 1] = mean + random.nextDouble() * mean;

        sum += uniformRandoms[i] + uniformRandoms[part - i -1];
    }
    uniformRandoms[(int)Math.ceil(part/2)] = uniformRandoms[(int)Math.ceil(part/2)] + number - sum;

    return uniformRandoms;
}

07-24 09:39
查看更多