私の理解が正しければ、あなたが求めている確率は分析的に計算できます。
私の感覚では、同じ数の 1、2、および 3 を持つすべてのドローを同等のものとして扱いたいと考えています (そうでない場合は以下を参照)。つまり、49 回連続の 1 の後に 2 が続く場合、2 の後に 49 回連続の 1 が続く場合と同じ 50 ドローの「結果」としてカウントされます。
その場合、探しているのは、(p1 = 0.5、p2 = 0.2、p3 = 0.3) およびカウント c1、c2、および c3 で評価された多項確率質量関数の値です。 3 秒 (これらの合計は 50 になります)。R の多項 PMF は次のように評価できます。
counts = c(c1, c2, c3)
myProbs = c(0.5, 0.2, 0.3)
dmultinom(x = counts, prob = myProbs)
あとは、50 回の抽選で発生する可能性のある 1、2、3 の組み合わせをすべて列挙するだけです。関数をnsimplex(3,50)
(combinat
パッケージから) 呼び出すと、これらが 1326 個あることがxsimplex(3,50)
わかり、関数 (同じパッケージにある) を呼び出すと、それらが行列形式で生成されます。以下は、1326 列の最初の 5 列です。
[,1] [,2] [,3] [,4] [,5]
[1,] 50 49 49 48 48
[2,] 0 1 0 2 1
[3,] 0 0 1 0 1
次に、列ごとに使用して、各列の dmultinom を評価する必要がありますapply
。
mySimplex = xsimplex(3, 50)
myProbs = c(0.5, 0.2, 0.3)
results = apply(mySimplex, 2, dmultinom, prob = myProbs)
ベクトルの n 番目のエントリはresults
、行列の n 列目のカウントの確率になりますmySimplex
。
これはあなたが求めていたものでしたか?
個別の順列:
個別の順列を別の方法でカウントしたい場合、個々の順列の確率は次のようになります。
0.5^(c_1) * 0.2^(c_2) * 0.3^(c_3)
ここで、 は引き分けc_1
の 1c_2
の数、2 の数、および3 の数です。c_3
しかし、それらすべてを列挙しようとしている場合は、もう一度考えてみてください。各文字が 1、2、または 3 である一意の長さ 50 のシーケンスの数は、3^50 > 10^23 です。