将一个数随机均匀地分成m份 [英] Dividing a number into m parts uniformly randomly

查看:66
本文介绍了将一个数随机均匀地分成m份的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何将一个大的正整数 n 分成 m 个部分均匀随机em>.后置条件:将所有 m 部分相加应该得到 n.

以下是我的尝试(在 java 中,如伪代码),但我认为它不会给我均匀随机分布.我首先通过除以 n/m 找到平均部分 avg.然后我生成 m-1 个随机数,它们的大小约为 avg(通过在 0 & avg 和 *avg & 2*avg* 之间交替生成随机数. 然后我从原始数字 n 中减去这些 m-1 个数字的总和,并将其设置为 m'th 部分.>

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

int[]divideUniformlyRandomly(int n, int m){int[] res = new int[m];int avg = n/m;整数总和 = 0;布尔交流发电机 = 假;for(int i = 0; i 

解决方案

public double[]divideUniformlyRandomly(double number, int part) {double uniformRandoms[] = new double[part];随机随机=新随机();双均值 = 数量/部分;双倍总和 = 0.0;for (int i=0; i

How do I divide a large positive integer n into m parts uniformly randomly. Post-condition: Adding up all the m parts should give n.

Below is my attempt(in java like pseudocode), but I don't think it will give me uniformly random distribution. I am first finding the average part avg by dividing n/m. Then I am generating m-1 random numbers which are around avg in magnitude(by alternately generating random numbers between 0 & avg, and *avg & 2*avg*. Then I am subtracting the sum of these m-1 numbers from original number n and setting that as the m'th part.

Assume that the function rand(x, y) returns a random number uniformly between x and 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;
}

这篇关于将一个数随机均匀地分成m份的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆