我已经看过关于该主题的几篇文章,但是它们似乎都不必要地复杂或错误-下列建议不会遇到前一个问题(很简单),但可能会遇到后一个问题(那是错误的)。

我的目标是随机生成均匀的s个整数,即正整数,使它们的总和为n。对我来说,以下生成1和n之间的s随机数,然后输出频率的解决方案可以得到我们想要的:

import random
from collections import defaultdict

samples = list()

for i in range(n) :
    samples.append(random.randint(1,s))

hist = defaultdict(int)

for sample in samples :
    hist[sample] += 1

freq = list()

for j in range(s) :
    freq.append(hist[j+1])

print('list:', freq)
print('sum:', sum(freq))


因此,例如,如果我们想要s = 10个随机整数,它们的总和为n = 100,则可以从此过程中获得,例如

list: [11, 7, 9, 12, 16, 13, 9, 10, 8, 5]
sum: 100


由于我绝不是统计学家,因此我担心这会产生并非真正均匀分布的数字。任何意见/分析将不胜感激

最佳答案

好吧,我相信您在这里提出的是multinomial distribution。直接来自维基百科-“它模拟n次滚动s面模具的计数概率”。
参数向量pi = 1 / s。


  但是它们看起来都不必要地复杂或错误


不确定您的想法,但在Python世界中从多项式采样意味着您使用NumPy,然后它是一线式的

import numpy as np

result = np.random.multinomial(n, [1.0/s for _ in range(s)])


而且对于所有可能的参数组合,它可能会更快,经过良好测试并得到纠正。

如果您发现它更适合您,就这样吧,但是发明一种新的方法来抽样知名发行本身就是一项艰巨的工作。请注意,在许多分布中,结果的总和等于固定数-例如Dirichlet-multinomial。而且它们有很多参数,您可以千差万别,获得统计上不同的结果。

关于python - 用给定的总和随机生成一个整数列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55093951/

10-11 15:18