我在想是否有办法生成一组随机数,其总和始终是一个常数。例如,20 可以分为 5 个数字(1、2、3、4、10),我不在乎这 5 个数字分别是什么,只要它们的总和等于 20。有没有办法以编程方式执行此操作?
为了获得均匀分布,技巧是将总和视为一条数轴,而不是为线段生成随机数,而是生成 n-1 个数字作为沿线的点,然后减去以获得线段。这是来自的函数奥伊兰德库 http://github.com/lcrocker/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]; }
}
ojr_rand(g, limit)
生成从 0 到 limit-1 的均匀随机整数。然后该函数填充数组a
with count
随机整数相加sum
。将此应用到任何其他 RNG 应该不会太难。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)