您要求未过滤长度为 6 30 = 2*10 23的结果,因此无法处理。
有两种可能性可以组合:
- 包括更多思考来预处理问题,例如关于如何仅对总和为 120 的样本进行抽样。
- 而是进行蒙特卡罗模拟,即不要对所有组合进行采样,而仅对 1000 个随机组合进行采样以获得具有代表性的样本,从而确定足够准确的标准。
现在,我只应用(2),给出蛮力代码:
N = 30 # number of dices
M = 100000 # number of samples
S = 120 # required sum
result = [[random.randint(1,6) for _ in xrange(N)] for _ in xrange(M)]
result = [s for s in result if sum(s) == S]
现在,该结果应该与您使用之前的结果相当numpy.product
……虽然那部分我无法遵循……
好的,如果您在 30 个骰子乘积的标准差之后出局,这就是您的代码所做的。然后我需要 1 000 000 个样本来获得 std(1 位)的大致可重现值 - 我的 PC 大约需要 20 秒,仍然远少于 100 万年:-D。
像 3.22*10 16这样的数字是你要找的吗?
评论后编辑:
嗯,对数字的频率进行采样只会给出 6 个自变量 - 实际上甚至 4 个,通过替换约束(总和 = 120,总数 = 30)。我当前的代码如下所示:
def p2(b, s):
return 2**b * 3**s[0] * 4**s[1] * 5**s[2] * 6**s[3]
hits = range(31)
subset = itertools.product(hits, repeat=4) # only 3,4,5,6 frequencies
product = []
permutations = []
for s in subset:
b = 90 - (2*s[0] + 3*s[1] + 4*s[2] + 5*s[3]) # 2 frequency
a = 30 - (b + sum(s)) # 1 frequency
if 0 <= b <= 30 and 0 <= a <= 30:
product.append(p2(b, s))
permutations.append(1) # TODO: Replace 1 with possible permutations
print numpy.std(product) # TODO: calculate std manually, considering permutations
这大约需要 1 秒计算,但令人困惑的是我得到的结果是 1.28737023733e+17。我以前的方法或这个方法有一个错误 - 或两者兼而有之。
抱歉——没那么容易:抽样的概率不同——这就是问题所在。每个样本都有不同数量的可能组合,给出了它的权重,在计算标准偏差之前必须考虑这一点。我已经在上面的代码中起草了这一点。