python - 骰子组合的标准差

标签 python algorithm numpy stdev

我正在尝试为从总和为 120 的骰子组合 (30) 中提取的一系列数字找到 stdev。我是 Python 的新手,所以这段代码使控制台卡住,因为数字是无穷无尽的并且我不确定如何将它们全部放入一个更小、更高效的函数中。我所做的是:

  • 找到 30 个骰子的所有可能组合;
  • 总和为 120 的筛选组合;
  • 将结果列表中列表中的所有项目相乘;
  • 尝试提取标准偏差。

代码如下:

import itertools
import numpy

dice = [1,2,3,4,5,6]
subset = itertools.product(dice, repeat = 30)

result = []
for x in subset:
    if sum(x) == 120:
        result.append(x)

my_result = numpy.product(result, axis = 1).tolist()
std = numpy.std(my_result)

print(std)

最佳答案

请注意 D(X^2) = E(X^2) - E(X)^2,您可以通过以下等式分析求解此问题。

f[i][N] = sum(k*f[i-1][N-k])        (1<=k<=6)
g[i][N] = sum(k^2*g[i-1][N-k])
h[i][N] = sum(h[i-1][N-k])

f[1][k] = k ( 1<=k<=6)
g[1][k] = k^2 ( 1<=k<=6)
h[1][k] = 1 ( 1<=k<=6)

示例实现:

import numpy as np

Nmax = 120
nmax = 30
min_value = 1
max_value = 6
f = np.zeros((nmax+1, Nmax+1), dtype ='object')
g = np.zeros((nmax+1, Nmax+1), dtype ='object') # the intermediate results will be really huge, to keep them accurate we have to utilize python big-int
h = np.zeros((nmax+1, Nmax+1), dtype ='object')
for i in range(min_value, max_value+1):
    f[1][i] = i
    g[1][i] = i**2
    h[1][i] = 1

for i in range(2, nmax+1):
    for N in range(1, Nmax+1):
        f[i][N] = 0
        g[i][N] = 0
        h[i][N] = 0
        for k in range(min_value, max_value+1):
            f[i][N] += k*f[i-1][N-k]
            g[i][N] += (k**2)*g[i-1][N-k]
            h[i][N] += h[i-1][N-k]

result = np.sqrt(float(g[nmax][Nmax]) / h[nmax][Nmax] - (float(f[nmax][Nmax]) / h[nmax][Nmax]) ** 2)
# result = 32128174994365296.0

关于python - 骰子组合的标准差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40323596/

相关文章:

algorithm - 如何解决余数函数?

algorithm - 二值图像 "Lines-of-Sight"边缘检测

python - numpy 用 2*2 block 的平均值替换数组元素

macos - 无法在 python 中导入打开的 cv2。错误 : Cannot compile 'Python.h' . 也许你需要安装 python-dev|python-devel [[无法升级 numpy ]]

python - 使用 Numpy 的参数化数组

python - 在kivy中设置全局字体大小

python - NDB 查询生成器无法按预期工作

python - 如何找到两条线段的交点?

algorithm - visual c++在std::sort中使用什么排序算法

python - 如何从 Python 中的 .txt 文件加载特定行?