为了账号安全,请及时绑定邮箱和手机立即绑定

选择固定和的n个数字

/ 猿问

选择固定和的n个数字

在某些代码中,我想选择总和为的n随机数。[0,1)1


我通过独立地选择数字[0,1)并通过将每个数字除以总和来对其进行归一化来实现:


numbers = [random() for i in range(n)]

numbers = [n/sum(numbers) for n in numbers]

我的“问题”是,我得到的分布非常偏斜。选择一百万个数字不会失败1/2。经过一些努力,我已经计算出了pdf,但效果并不理想。


这是我为5个变量得到的奇怪的pdf文件:


您是否有一个好的算法来选择数字,从而使分布更均匀或更简单?


查看完整描述

3 回答

?
慕容3067478

您正在寻找将距离从0划分为1的方法。

从0到1中选择n-1个数字,对它们进行排序并确定每个数字之间的距离。

这会将空间0划分为1,这偶尔会产生较大的结果,而您却没有得到。

即使这样,对于较大的n值,您通常也可以期望最大值也随之减小,而不是与方法一样快。


查看完整回答
反对 回复 2019-12-03
?
慕莱坞森

另一种获取n总计为1的随机数的方法:


import random



def create_norm_arr(n, remaining=1.0):

    random_numbers = []

    for _ in range(n - 1):

        r = random.random()  # get a random number in [0, 1)

        r = r * remaining

        remaining -= r

        random_numbers.append(r)

    random_numbers.append(remaining)

    return random_numbers


random_numbers = create_norm_arr(5)

print(random_numbers)

print(sum(random_numbers))

这使更高的数字更有可能。


查看完整回答
反对 回复 2019-12-03
?
忽然笑

您可能对Dirichlet分布感兴趣,该分布用于生成求和为1的数量。还有如何使用伽玛分布来生成它们一节在这里。


查看完整回答
反对 回复 2019-12-03

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信