Python numpy-给定一个数字,用模糊权重求和

Python numpy-给定一个数字,用模糊权重求和,python,numpy,Python,Numpy,假设你有一个数字,你想代表一个总数——假设它是123456789 现在,假设您想要生成一些与该数字相加的数字,但具有模糊权重 例如,假设我想生成三个数字。第一个应该是总数的60%左右,但有一些小的差异。第二个应该是总数的30%,同样有一些差异。第三个最终将是10%左右,这取决于其他两个 我试着这样做: percentages = [0.6, 0.3] total = 123456789 still_need = total values = [] for i in range(2): x

假设你有一个数字,你想代表一个总数——假设它是123456789

现在,假设您想要生成一些与该数字相加的数字,但具有模糊权重

例如,假设我想生成三个数字。第一个应该是总数的60%左右,但有一些小的差异。第二个应该是总数的30%,同样有一些差异。第三个最终将是10%左右,这取决于其他两个

我试着这样做:

percentages = [0.6, 0.3]
total = 123456789
still_need = total
values = []
for i in range(2):
    x = int(total * (percentages[i] + np.random.normal(scale=0.05)))
    values.append(x)
    still_need = still_need - x
values.append(still_need)
但这似乎不太优雅


有更好的方法吗?

一个干净的方法是从


在这种情况下,多项式分布模型滚动一个三面模具123456789次,其中每个面翻转的概率为[0.6,0.3,0.1]。调用
多项式()
就像是对这个实验进行一次尝试。它返回3个随机整数,总和为123456789。它们表示模具每个面出现的次数。如果需要多个绘图,可以使用
size
parameter`.

Does
np.random.multinomial
在引擎盖下调用基础函数123456789次?我运行了
%timeit
,速度似乎快得不可思议。几乎可以肯定不是。虽然您可以模拟滚动模具,但幸运的是,有更有效的方法来生成多项式随机数。我不知道NumPy用什么。但是,例如,见Devroye(1986)“非均匀随机变量生成”。他展示了如何将多项式随机数生成为二项式随机数序列(生成速度很快)。对于d面模具,使用此方法进行单次拉伸需要O(d)时间。
total = 123456789
percentages = [0.6, 0.3, 0.1]
values = np.random.multinomial(total, percentages)