6 30 = 2*10 23のフィルタリングされていない長さの結果を要求しますが、そのように処理することは不可能です。
組み合わせることができる 2 つの可能性があります。
- たとえば、合計が 120 のものだけをサンプリングする方法など、問題を前処理するためのより多くの考えを含めます。
- 代わりにモンテカルロ シミュレーションを実行します。つまり、すべての組み合わせをサンプリングするのではなく、1000 のランダムなカップルのみをサンプリングして、十分に正確な std を決定する代表的なサンプルを取得します。
今、私はブルートフォースコードを与えて、(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 個のサイコロの積の標準偏差の後でアウトになった場合、それがコードの動作です。次に、std (1 桁) のほぼ再現可能な値を取得するには、1 000 000 サンプルが必要です。
探しているのは3.22*10 16のような数値ですか?
コメントの後に編集:
数の頻度をサンプリングすると、代わりに 6 つの独立変数のみが得られます。実際には、制約 (合計 = 120、合計数 = 30) を代入することにより、4 つでもあります。私の現在のコードは次のようになります。
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 が得られることです。私の以前のアプローチまたはこれにはバグがあります-またはその両方です。
申し訳ありませんが、簡単ではありません。サンプリングの確率は同じではありません。これが問題です。各サンプルには異なる数の可能な組み合わせがあり、その重みを与えます。これは、標準偏差を取得する前に考慮する必要があります。上記のコードでそれを下書きしました。