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,您可能必须修改此方法。