选择固定和的n个数

7
在某些代码中,我想要选择[0,1)范围内的n个随机数,使它们总和为1
我是通过在[0,1)范围内独立地选择数字,并通过将每个数字除以总和来使它们归一化来实现这一点的:
numbers = [random() for i in range(n)]
numbers = [n/sum(numbers) for n in numbers]

我的“问题”是,我得到的分布相当倾斜。选择一百万个数字,没有一个超过1/2。我已经计算了概率密度函数,但它并不好看。
以下是我得到的5个变量的奇怪外观的概率密度函数:

enter image description here

你有什么好的算法来选择数字,以获得更均匀或简单的分布吗?

5
我不确定我理解了,如果你将数字1分成一百万个随机部分,就 不应该 有一个超过0.5。如果有的话,那意味着其他999,999个部分必须适合另一半。 - DShook
请查看固定和的随机向量。下载链接指向一个包含MATLAB代码和算法说明文档的文件。 - NPE
可能是 在Python中生成多个随机数以等于一个值 的重复问题。 - BlueRaja - Danny Pflughoeft
3个回答

19
你想要将从0到1的距离进行分区。
从0到1中选择n-1个数字,排序并确定它们之间的距离。
这将分割0到1的空间,应该会产生偶尔你没有得到的大结果。
即使如此,对于较大的n值,你通常也可以期望你的最大值减少,只是不像你的方法那么快。

1
一个可爱的算法。你知道这可能会产生什么分布吗? - Thomas Ahle
除了称其为“随机分区”之外,我不知道如何称呼它。我一直从分区的角度来看待它,而不是从段长度的分布角度来看待它。 - LanceH
我推导出了累积分布函数1-(1-x)^n和概率质量函数n(1-x)^(n-1)。该分布似乎具有更高的小数概率(它没有接近1/n的峰值),因此可能也具有更多的大数。我还没有将其与狄利克雷分布进行比较。 - Thomas Ahle
2
这是Beta分布,其中最简单的情况是n个均匀分布元素的最小值的概率分布。 - Jérémie

6

如果你想寻求概率方面的帮助,可以考虑使用狄利克雷分布,该分布用于生成总和为1的数量。同时,这里还有一个使用伽马分布生成狄利克雷分布的方法,点击这里查看。


通常情况下,您需要一些与均匀分布不同的分布来绘制数字。正如Job的答案所建议的那样,您可以使用alpha < 1的Gamma分布来获得更“尖峰”的结果。这样做将为您提供从Dirichlet分布中绘制的内容,这很方便,因为它是您所寻找的多项式共轭先验。 - Jonathan Chang
这篇文章有一个不错的“绘图”部分,我已经添加了一些代码示例。我不太确定参数是什么并不重要,只要它们相等就可以了吧? - Thomas Ahle

0

获取一组随机数,使它们的和为 1 的另外一种方法是:

n
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))

这会使更高的数字更有可能出现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接