随机生成一组n长度总和x的数字

dan*_*nem 0 algorithm math combinatorics

我正在开发一个有趣的项目,我需要一个算法来做如下:生成一个长度的数字列表n,加起来x

我会满足于整数列表,但理想情况下,我希望留下一组浮点数.

如果这个问题没有得到充分研究,我会非常惊讶,但我不确定该寻找什么.

我过去曾经解决过类似的问题,但这个问题本质上是截然不同的.在我生成将加起来为x的数字列表的不同组合之前.我确信我可以简单地强迫这个问题,但这似乎不是理想的解决方案.

任何人都知道这可能被称为什么,或如何接近它?谢谢大家!

编辑:为了澄清,我的意思是列表应该是长度N,而数字本身可以是任何大小.

edit2:对于我对'set'的不当使用感到抱歉,我使用它作为列表或数组的所有术语.我明白它引起了混乱,我道歉.

650*_*502 6

这是在Python中如何做到这一点

import random

def random_values_with_prescribed_sum(n, total):
    x = [random.random() for i in range(n)]
    k = total / sum(x)
    return [v * k for v in x]
Run Code Online (Sandbox Code Playgroud)

基本上你选择n个随机数,计算它们的总和并计算一个比例因子,这样总和将是你想要的.

请注意,这种方法不会产生"统一"切片,即如​​果在给定总和的所有分布中随机选取,则您将获得的分布将更倾向于"平等".

要查看原因,您只需描绘算法在具有规定总和的两个数字(例如1)的情况下所执行的操作:

在此输入图像描述

该点P是通过拾取两个随机数得到的通用点,它在正方形内部是均匀的[0,1]x[0,1].该点Q是通过缩放获得的点P,使得总和需要为1.从图中可以清楚地看出,靠近中心的点具有更高的概率; 例如,通过投射对角线上的任何点可以找到正方形的正中心(0,0)-(1,1),而该点将(0, 1)被发现仅投射点(0,0)-(0,1)......对角线长度是sqrt(2)=1.4142...正方形边1.0.