random - 生成总和为常数的随机数

标签 random numbers sum

我在想是否有办法生成一组总和始终为常数的随机数。例如,20 可以分为 5 个数字(1、2、3、4、10)我不在乎这 5 个数字中的每一个是什么,只要它们的总和等于 20。无论如何以编程方式这样做?

最佳答案

要获得均匀分布,诀窍是将您的总和视为一条数轴,而不是为线段生成随机数,而是生成 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]; }
}
ojr_rand(g, limit)生成一个从 0 到 limit-1 的均匀随机整数。这个函数然后填充数组 acount添加到 sum 的随机整数.将此适应任何其他 RNG 应该不会太难。

关于random - 生成总和为常数的随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16883419/

相关文章:

Python - 使用没有重复单词的随机并从列表中选择一个备用单词

javascript - 如何检查用户输入的是不是数字?

javascript - 在 JavaScript 中创建类似于 Number 的对象

SQL : How to sum multiple bit columns in a row

python - 创建一个包含 N 个随机数的列表,其中包含最大值、最小值和总和

java - 生成一个介于 0 和 x 之间的随机数 (Java)

java - Java中的11位随机数

c - 随 secret 码生成器相同的字符串

linux - 是否可以让vim显示行号?

php - 计算并存储另一个表中列的 SUM