将一个数字随机均匀地分成m份

3
如何将一个较大的正整数 n 平均随机分成 m 份。 后置条件:所有 m 份数之和应等于 n
以下是我的尝试(类似于java的伪代码),但我不认为它会给我平均随机分布。 首先,我通过将n/m进行除法来找到平均部分 avg。然后,我生成大小约为 avg 的 m-1 个随机数(交替生成介于 0 和 avg 之间和 *avg 和 2*avg* 之间的随机数)。 然后,我从原始数字 n 中减去这些 m-1 数字的总和,并将其设置为第 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;
}

你想用Java编写实际的代码吗?请添加语言标签,否则以后没有人会看到你的问题,因为“random”不是一个非常流行的标签。 - Tudor
可能是获取N个随机数,使它们的和为M的重复问题。还有相关问题:https://dev59.com/flbTa4cB1Zd3GeqP7hqu - finnw
还可以查看这个问题,它有一个非常好的答案。 - finnw
哇!我需要提高我的搜索技能。我尝试找到可能的重复项,但是没有找到。 - Prabhakar
@Prab 我搜索了 [random] "sum"。 - finnw
2个回答

4

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;
}


0

你应该使用 m-1 个均匀分布的栅栏将 n 分成 m 部分。你的代码可能是:

int[] divideUniformlyRandomly(int n, int m)
{
    int[] fences = new int[m-1];
    for(int i = 0; i < m - 2; i++)
    {
        fences[i] = rand(0, n-1);
    }
    Arrays.sort(fences);

    int[] result = new int[m];
    result[0] = fences[0];
    for(int i = 1; i < m - 2; i++)
    {
        result[i] = fences[i+1] - fences[i];
    }
    result[m-1] = n - 1 - fences[m-2];

    return result;
}

为了说明这一点: enter image description here


你已经绘制了得到的值吗?它们是否均匀分布? - andrew cooke
@andrewcooke,我刚看到我的回答与https://dev59.com/iWsz5IYBdhLWcg3wNE1q#8064754重复了。同一问题的最受欢迎的答案实际上表明这种方法产生均匀分布。 - olivieradam666
好的,我在询问个体值是否均匀。这与询问点是否在n-1维平面上均匀分布不同。我仍然不完全理解,但我的原始图已经无关紧要了。 - andrew cooke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接