【发布时间】:2019-03-11 00:58:02
【问题描述】:
我已经看过几篇关于这个主题的帖子,但是它们似乎都不必要地复杂或错误 --- 下面的建议没有遇到前一个问题(它很简单),但可能是后者(它是错误的)。
我的目标是生成s 整数,即,正整数,均匀随机,使得它们的总和为n。对我来说,下面的解决方案是在 1 和 s 之间生成 n 随机数,然后输出频率得到我们想要的:
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
由于无论如何我都不是统计学家,我担心这会产生并非真正均匀分布的数字。任何 cmets/分析将不胜感激
【问题讨论】:
-
如果代码有效但可以改进,它应该在代码审查中。该站点主要用于修复损坏的代码。
-
“均匀随机”到底是什么意思?每个单独的数字是否应该同样频繁地出现,或者每个有效组合是否应该同样出现?在第一个的情况下:请注意,例如,对于三个总和为 5 的数字,如果第一个数字是 1,则其他数字可以是 (1,3)、(2,2) 或 (3,1),但如果第一个是 3,其他两个只能是 (1,1),即一些构成数字可以在更多组合中使用,任何可能(应该?)因此出现更多。
-
关于您的样本中的不均匀性:随机数生成效果很好,您的样本太小了。试试
n=1000或n=10000。如果数字在任何样本中出现的频率相同,那么它们就不是随机的。