python随机样本用于大于人口的样本

时间:2018-09-20 13:24:01

标签: python random

我有一个整数列表,这些整数代表60天内每天提交的申请数量。我需要随机生成一个288个整数的列表,这些列表总计为每天的应用程序数量。我有以下代码:

public function build(array $customer)
{
  return view('link')->with([
    'customer'=> $customer,
  ])->render();
}

此处发布的是整数列表,这些整数是每天提交的申请总数。该代码对于大于288的数字非常有用,但对于小于288的数字则崩溃。在这里阅读时,我看到应该使用random.choice,但是我不知道如何正确实现它。从结果看,似乎从未打印过0,因此很明显是问题的潜在根源。有什么建议吗?

2 个答案:

答案 0 :(得分:3)

坦率地说,所有这些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]))

答案 1 :(得分:2)

很明显,如果要将多个n个数字添加到n中,则其中一些数字将必须为零。因此,您不能像使用sample那样选择不同的数字作为分隔符。取而代之的是,只需使用choice来选择任何值作为分隔符,包括重复项,将0n添加为起点和终点,并得到差异。 / p>

def random_sum_to(n, num_terms = None):
    num_terms = (num_terms or r.randint(2, n)) - 1
    a = sorted([r.randrange(n) for _ in range(num_terms)])
    return [y-x for x, y in zip([0]+a, a+[n])]

这样,random_sum_to(200, 288)的可能结果可能看起来像这样:

[0, 2, 1, 0, 0, 0, 1, 0, 2, 2, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 2, 0, 0, 2, 0, 2, 1, 0, 1, 0, 0, 1, 0, 1, 0, 2, 0, 0, 1, 0, 1, 0, 2, 0, 0, 1, 4, 0, 1, 2, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 2, 0, 2, 1, 0, 0, 1, 1, 2, 0, 0, 4, 1, 0, 1, 1, 0, 2, 0, 1, 0, 2, 0, 2, 0, 1, 2, 0, 1, 2, 1, 1, 0, 0, 1, 0, 1, 1, 1, 2, 1, 1, 2, 0, 0, 2, 0, 0, 0, 1, 0, 0, 1, 0, 1, 2, 2, 0, 0, 3, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 3, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 2, 1, 0, 0, 1, 1, 1, 0, 0, 2, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 3, 0, 0, 1, 0, 1, 0, 1, 2, 0, 0, 0, 1, 2, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 2, 0, 1, 0, 0, 0, 4, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 3, 1, 0, 2, 0, 0, 1, 0, 1, 2, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 3, 3, 0, 1, 1, 0, 1, 0, 2, 0, 1, 0, 2, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 2]