生成 N 个均匀随机数,总和为 M

spa*_*per 6 python random algorithm distribution

这个问题以前曾被问过,但我从未见过一个好的答案。

  1. 我想生成 8 个总和为 0.5 的随机数。

  2. 我希望每个数字都是从均匀分布中随机选择的(即,下面的简单函数将不起作用,因为数字不会均匀分布)。

    def rand_constrained(n,tot):
        r = [random.random() for i in range(n)]  
        s = sum(r)
        r = [(i/s*tot) for i in r] 
        return r
    
    Run Code Online (Sandbox Code Playgroud)

该代码应该是可推广的,以便您可以生成 N 个均匀随机数,其总和为 M(其中 M 是正浮点数)。如果可能的话,您能否解释一下(或用图表示)为什么您的解决方案均匀地在适当的范围内生成随机数?

未达标的相关问题:

生成多个随机数以等于 python 中的值(当前接受的答案不统一 - 另一个统一的答案仅适用于整数)

获取N个随机数,总和为M(Java中的同一问题,当前接受的答案完全错误,也没有均匀分布的答案)

生成 R 中总和为 M 的 N 个随机整数(同样的问题,但在 R 中具有正态(非均匀)分布)

任何帮助是极大的赞赏。

ins*_*get 0

对于完全通用的解决方案(“我想要和n之间的数字,总和为):lowhighm

from random import uniform as rand

def randConstrained(n, m, low, high):
    tot = m
    if not low <= 0 <= high:
        raise ValueError("Cannot guarantee a solution when the input does not allow for 0s")
    answer = []
    for _ in range(n-1):
        answer.append(low + rand(0,tot) * (high-low))
        tot -= answer[-1]
    answer.append(m-sum(answer))
    return answer
Run Code Online (Sandbox Code Playgroud)

对于您的情况,可以按如下方式使用:

In [35]: nums = randConstrained(8, 0.5, 0, 1)

In [36]: nums
Out[36]: 
[0.2502590281277123,
 0.082663797709837,
 0.14586995648173873,
 0.011270073049224807,
 0.009328970756471237,
 0.00021993111786291258,
 0.0001831479074098452,
 0.000205094849743237]
Run Code Online (Sandbox Code Playgroud)

  • 更好,但对“低”和“高”的处理是错误的,并且分布系统地在生成的第一个数字中赋予了过多的权重。 (4认同)