Mathematicaの乱数ジェネレータは二項確率から逸脱していますか?


9

それで、コインを10回めくって、それを1つの「イベント」と呼ぶとしましょう。実行すると、これらの「イベント」の1,000,000で、頭が0.4〜0.6のイベントの割合はどれくらいですか?二項確率はこれが約0.65であることを示唆しますが、私のMathematicaコードは約0.24を教えてくれます

これが私の構文です:

In[2]:= X:= RandomInteger[];
In[3]:= experiment[n_]:= Apply[Plus, Table[X, {n}]]/n;
In[4]:= trialheadcount[n_]:= .4 < Apply[Plus, Table[X, {n}]]/n < .6
In[5]:= sample=Table[trialheadcount[10], {1000000}]
In[6]:= Count[sample2,True];
Out[6]:= 245682

事故はどこにありますか?


3
おそらくこれは、mathematica stackexchange mathematica.stackexchange.comに
Jeromy Anglim

1
@JeromyAnglimこの場合、問題はおそらく厳密にコーディングではなく推論にあると思います。
Glen_b-2015

@Glen_b主なことは、あなたが提供したように見えるインターネット上のどこかに良い答えがあるということです。:-)
Jeromy Anglim 2015

回答:


19

事故は、厳密な「より小さい」の使用です。

(105)(12)100.246

制限に0.4と0.6を含めると(つまり、10トスで4、5、または6頭)、結果は約0.656の確率になります。

あなたの最初の考えは乱数発生器の問題ではないはずです。この種の問題は、これまでずっとMathematicaのように頻繁に使用されるパッケージで明らかでした。


皮肉なことに、@ TimMcKnightは二項確率を示しました。
Simon Kuang

8

あなたが書いたコードに関するコメント:

  • 定義したexperiment[n_]が使用したことがなく、代わりにその定義をで繰り返したtrialheadcount[n_]
  • experiment[n_]はるかに効率的に(組み込みコマンドを使用せずにプログラムすることができるBinomialDistribution)などTotal[RandomInteger[{0,1},n]/n、これもなるだろうX不要。
  • experiment[n_]が厳密に0.4と0.6の間であるケースの数を数えることは、書くことによってより効率的に達成されますLength[Select[Table[experiment[10],{10^6}], 0.4 < # < 0.6 &]]

xp^=x/10x=5PR[4X6=6 Σ X=4 10

Pr[X=5]=(105)(0.5)5(10.5)50.246094.
Pr[4X6]=x=46(10x)(0.5)x(10.5)10x=67210240.65625.
0.4 <= # <= 0.6代わりに。もちろん、次のように書くこともできます
Length[Select[RandomVariate[BinomialDistribution[10,1/2],{10^6}], 4 <= # <= 6 &]]

このコマンドは、元のコードより約9.6倍高速です。私がMathematicaにいるよりもさらに熟練した誰かがそれをさらにスピードアップできると想像します。


2
を使用すると、コードをさらに10倍高速化できますTotal@Map[Counts@RandomVariate[BinomialDistribution[10, 1/2], 10^6], {4, 5, 6}]Counts[]組み込み関数であるはSelect[]、任意の述語で動作する必要があると比較して高度に最適化されていると思います。
David Zhang

1

Mathematicaで確率実験を行う

Mathematicaは確率と分布を操作するための非常に快適なフレームワークを提供します-適切な制限の主な問題は対処されていますが、この質問を使用してこれをより明確にし、参考として役立つと思います。

実験を繰り返し可能にして、好みに合わせていくつかのプロットオプションを定義しましょう。

SeedRandom["Repeatable_151115"];
$PlotTheme = "Detailed";
SetOptions[Plot, Filling -> Axis];
SetOptions[DiscretePlot, ExtentSize -> Scaled[0.5], PlotMarkers -> "Point"];

パラメトリック分布の操作

これで、1つのイベントの漸近分布を定義できます。これは、(フェア)コインの回のスローにおけるヘッドの比率です。n個πn

distProportionTenCoinThrows = With[
    {
        n = 10, (* number of coin throws *)
        p = 1/2 (* fair coin probability of head*)
    },
    (* derive the distribution for the proportion of heads *)
    TransformedDistribution[
        x/n,
        x \[Distributed] BinomialDistribution[ n, p ]
    ];

With[
    {
        pr = PlotRange -> {{0, 1}, {0, 0.25}}
    },
    theoreticalPlot = DiscretePlot[
        Evaluate @ PDF[ distProportionTenCoinThrows, p ],
        {p, 0, 1, 0.1},
        pr
    ];
    (* show plot with colored range *)
    Show @ {
        theoreticalPlot,
        DiscretePlot[
            Evaluate @ PDF[ distProportionTenCoinThrows, p ],
            {p, 0.4, 0.6, 0.1},
            pr,
            FillingStyle -> Red,
            PlotLegends -> None
        ]
    }
]

これにより、比率の離散分布のプロットが得られます。 TheoreticalDistributionPlot

分布をすぐに使用して、と確率を計算できます:Pr[Pr[0.4π0.6|πB(10,12)]Pr[0.4<π<0.6|πB(10,12)]

{
    Probability[ 0.4 <= p <= 0.6, p \[Distributed] distProportionTenCoinThrows ],
    Probability[ 0.4 < p < 0.6, p \[Distributed] distProportionTenCoinThrows ]
} // N

{0.65625、0.246094}

モンテカルロ実験を行う

1つのイベントの分布を使用して、そこから繰り返しサンプリングすることができます(モンテカルロ)。

distProportionsOneMillionCoinThrows = With[
    {
        sampleSize = 1000000
    },
    EmpiricalDistribution[
        RandomVariate[
            distProportionTenCoinThrows,
            sampleSize
        ]
    ]
];

empiricalPlot = 
    DiscretePlot[
        Evaluate@PDF[ distProportionsOneMillionCoinThrows, p ],
        {p, 0, 1, 0.1}, 
        PlotRange -> {{0, 1}, {0, 0.25}} , 
        ExtentSize -> None, 
        PlotLegends -> None, 
        PlotStyle -> Red
    ]
]

EmpirialDistributionPlot

これを理論的/漸近的分布と比較すると、すべてがほぼ以下に当てはまることがわかります。

Show @ {
   theoreticalPlot,
   empiricalPlot
}

分布の比較


Mathematica SEのMathematicaに関するより多くの背景情報を含む同様の投稿を見つけることができます。
gwr 2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.