我有一个整数列表,代表 60 天内每天提交的申请数量。我需要随机生成一个包含 288 个整数的列表,这些整数总和为每天的申请数量。我有以下代码:
import random as r
issued = [1000,200,344...]
def random_sum_to(n, num_terms = None):
num_terms = (num_terms or r.randint(2, n)) - 1
a = r.sample(range(1, n), num_terms) + [0, n]
list.sort(a)
return [a[i+1] - a[i] for i in range(len(a) - 1)]
for i in issued:
print(random_sum_to(i,288))
发布的是整数列表,是每天提交的应用程序的总和。此代码适用于大于 288 的数字,但适用于小于 288 的数字。阅读此处我看到应该使用 random.choice,但我无法弄清楚如何正确实现它。查看结果,似乎从未打印过 0,因此这显然是问题的潜在来源。有什么建议吗?
最佳答案
坦率地说,所有这些 zip 内容、列表理解等可能看起来很聪明,但你为什么不使用 Multinomial sampling ?
实际上,根据定义,总和自动等于 N
import numpy as np
t = np.random.multinomial(200, [1/288.]*288, size=1) # sample 288 numbers summed to 200
print(t)
print(sum(t[0]))
t = np.random.multinomial(1000, [1/288.]*288, size=1) # sample 288 numbers summed to 1000
print(t)
print(sum(t[0]))
关于大于人口的样本的python随机样本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52426195/