Algorithm 选择n个固定和数

Algorithm 选择n个固定和数,algorithm,math,random,probability,sample,Algorithm,Math,Random,Probability,Sample,在一些代码中,我想选择[0,1)中的n随机数,其总和为1 我通过在[0,1)中独立选择数字,并通过将每一个数字除以总和来规范化它们: numbers = [random() for i in range(n)] numbers = [n/sum(numbers) for n in numbers] 我的“问题”是,我得到的分布是非常不均匀的。选择一百万个数字而不是一个数字会超过1/2。通过一些努力,我计算出了pdf,这并不好 以下是5个变量的怪异pdf: 您是否有一个好的算法来选择数字,从而

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

我通过在
[0,1)
中独立选择数字,并通过将每一个数字除以总和来规范化它们:

numbers = [random() for i in range(n)]
numbers = [n/sum(numbers) for n in numbers]
我的“问题”是,我得到的分布是非常不均匀的。选择一百万个数字而不是一个数字会超过
1/2
。通过一些努力,我计算出了pdf,这并不好

以下是5个变量的怪异pdf:


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

如果您在寻找概率,您可能会对用于生成和为1的数量的算法感兴趣。还有一节介绍如何使用伽马分布生成它们。

您正在寻找p分区从0到1的距离

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

这将把空间划分为0到1,这将偶尔产生一个大的结果,而你不会得到这个结果


即使如此,对于较大的n值,您通常也可以预期最大值也会减小,只是速度不如您的方法。

另一种获取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))

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

我不确定我是否理解,如果你将数字1分成一百万个随机片段,那么不应该有一个大于0.5的片段。如果有,那意味着其他99999必须适应另一半。请看。下载链接会指向一个包含MATLAB代码的文件和一个解释算法。可能的重复通常需要一些分布,而不是从哪个均匀分布来绘制数字。正如job的答案所建议的,可以使用α<1的伽马分布来获得“峰值”结果。这样做可以从狄里克莱分布中得出一个图,这很方便,因为它是所求多项式的共轭先验。这篇文章有一个很好的“图”部分,我在其中添加了一些代码示例。我不确定参数是什么是否重要,只要它们相等?一个可爱的算法。你知道这会导致什么分布吗?除了称之为“随机分区”之外,我不知道如何引用它。我总是从事物的分区方面来看它,而不是从段长度的分布来看它。我推导了cdf
1-(1-x)^n
和pmf
n(1-x)^(n-1)
。分布接缝具有更高的小数字概率(在1/n附近没有峰值)这是贝塔分布,其中最简单的情况是n的最小元素的概率分布。