Java 将一个数均匀随机地分成m个部分

Java 将一个数均匀随机地分成m个部分,java,random,Java,Random,如何将一个大的正整数n随机均匀地分成m部分。 Post条件:将所有m部分相加应得到n 下面是我的尝试(在类似java的伪代码中),但我认为它不会给我均匀的随机分布。 我首先通过除以n/m求出平均零件数。然后我生成m-1随机数,其大小在平均值附近(通过交替生成0&avg和*avg&2*avg*之间的随机数)。然后我从原始数n中减去这些m-1数字的总和,并将其设置为第m部分 假设函数rand(x,y)在x和y之间统一返回一个随机数 int[] divideUniformlyRandomly(int

如何将一个大的正整数n随机均匀地分成m部分。 Post条件:将所有m部分相加应得到n

下面是我的尝试(在类似java的伪代码中),但我认为它不会给我均匀的随机分布。 我首先通过除以n/m求出平均零件数。然后我生成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;
}
int[]divideUniformlyRandomly(int n,int m)
{
int[]res=新的int[m];
int平均值=n/m;
整数和=0;
布尔交流发电机=假;
对于(int i=0;i
您应该使用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;
}
int[]divideUniformlyRandomly(int n,int m)
{
int[]fences=新int[m-1];
对于(int i=0;i
为了说明这一点:

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;
}
public double[]divideUniformlyRandomly(双精度数字,整数部分){
双单面域[]=新的双[部分];
随机=新随机();
双平均值=数量/部分;
双和=0.0;

对于(int i=0;i你想实际代码是java吗?请放一个语言标签,否则以后没人会看到你的问题,因为
random
不是一个很流行的标签。谢谢!我添加了java标签。可能是的重复。也有关系:也看看哪个有很好的答案。哇!我需要提高我的搜索技能。我试过了可能重复,但不能。你绘制了你得到的值吗?它们是均匀分布的吗?@andrewcooke我刚刚看到我的答案是的重复。对同一个问题投票最多的答案实际上是这个方法产生均匀分布。好的,我问的是单个值是否均匀。哪个这和问这些点是否均匀分布在n-1维平面上不同。我仍然不完全理解,但我的原始图是不相关的。