首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将一个数字随机地划分为m个部分

将一个数字随机地划分为m个部分
EN

Stack Overflow用户
提问于 2012-03-27 14:21:51
回答 2查看 4.2K关注 0票数 3

如何将一个大的正整数n随机地划分为m部分。后置条件:将所有m部件相加,就会给出n.

下面是我的尝试(在java中类似伪代码),但我不认为它会给出一致的随机分布。我首先用n/m除以求出平均部分avg,然后生成m-1随机数,其大小在avg的大小之间(在0& avg和*avg & 2*avg*之间交替生成随机数)。然后,我从原始数n中减去这些m-1数的和,并将它设为m‘’th部分。

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

代码语言:javascript
运行
复制
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;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-30 07:13:39

代码语言:javascript
运行
复制
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;
}

票数 4
EN

Stack Overflow用户

发布于 2012-03-29 12:41:11

你应该用m-1均匀分布的栅栏把n除以m个部分.您的代码可以是:

代码语言:javascript
运行
复制
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;
}

为了说明这一点:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9891457

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档