生成总和为常数的随机数

liu*_*uda 7 random numbers sum

我在想,无论如何都要产生一组随机数,其总和总是一个常数.例如,20可以分成5个数字(1,2,3,4,10)我不关心5个数字中的每一个是什么,只要它们的总和等于20.无论如何以编程方式这样做?

Lee*_*ker 15

为了获得均匀分布,诀窍是将总和视为数字线,而不是为分段生成随机数,生成n-1个数字作为沿线的点,并减去得到分段.这是ojrandlib的功能:

static int compare(const void *a, const void *b) {
    return *(int*)a - *(int*)b;
}
void ojr_array_with_sum(ojr_generator *g, int *a, int count, int sum) {
    int i;
    for (i = 0; i < count-1; ++i) { a[i] = ojr_rand(g, sum+1); }
    qsort(a, count-1, sizeof(int), compare);
    a[count-1] = sum;
    for (i = count-1; i > 0; --i) { a[i] -= a[i-1]; }
}
Run Code Online (Sandbox Code Playgroud)

ojr_rand(g, limit)生成从0到limit-1的均匀随机整数.然后,此函数a使用count添加的随机整数填充数组sum.不应该太难以适应任何其他RNG.


hoj*_*ram -1

使用库函数获取随机数。

现在您想要的随机数是生成的随机数 mod 允许的总和。

接下来,将允许的总和减去刚刚生成的数字。

假设您的库随机数生成器返回的第一个随机数是 109。

因此,您的第一个随机数是 109 mod 20 = 9。将允许的总数更新为 20 -9 = 11。

继续下去,直到允许的金额为零。

请注意,我假设您提到的数字 5 只是一个示例。如果您希望随机数的数量恰好为 5,您可能必须修改此方法。