少なくともn回m回発生する何かの確率


11

成功確率p、数nおよび試行回数mが与えられると、m回の試行のうち少なくとも n回の成功の可能性を返すプログラムまたは関数を記述します。

回答は、小数点以下5桁以上で正確でなければなりません。

テストケース:

 0.1, 10, 100 -> 0.54871
 0.2, 10, 100 -> 0.99767
 0.5, 13,  20 -> 0.13159
 0.5,  4,   4 -> 0.06250
0.45, 50, 100 -> 0.18273
 0.4, 50, 100 -> 0.02710
   1,  1,   2 -> 1.00000
   1,  2,   1 -> 0.00000
   0,  0,   1 -> 1.00000
   0,  0,   0 -> 1.00000
   0,  1,   1 -> 0.00000
   1,  1,   0 -> 0.00000

3
二項分布を研究していない私たちに公式を含めてくれませんか?
リーキー修道女

2
@KennyLau申し訳ありませんが、それは挑戦の一部です。
orlp

回答:


3

ゼリー15 14 バイト

2ṗ’S<¥ÐḟCạ⁵P€S

コマンドライン引数としてmn、およびpを(この順序で)読み取ります。オンラインでお試しください!

このアプローチが必要であることを注意O(2 Mがないので、時間とメモリが非常にテストケースのための効率的な十分なM = 100。私のマシンでは、テストケース(m、n、p)=(20、13、0.5)に約100秒かかります。オンライン通訳にはメモリが多すぎます。

使い方

2ṗ              Cartesian product; yield all vectors of {1, 2}^n.
  ’             Decrement, yielding all vectors of {0, 1}^n.
      Ðḟ        Filter; keep elements for which the link to the left yields False.
     ¥          Combine the two links to the left into a dyadic chain.
   S              Sum, counting the number of ones.
    <             Compare the count with n. 
        C       Complement; map z to 1 - z.
         ạ⁵     Compute the absolute difference with p.
           P€   Compute the product of each list.
             S  Compute the sum of all products.

9

Mathematica、29バイト

BetaRegularized[#3,#,1+#2-#]&

入力を順番に受け取りますn,m,p。Mathematicaは非常に優れているので、あなたのコードをゴルフにかけることさえできます:

ここに画像の説明を入力してください

BetaRegularizedは、正規化された不完全なベータ関数です。


6

R、32 31バイト

function(p,n,m)pbeta(p,m,1+n-m)

編集-1バイトのベータ分布への切り替え(@ Sp3000 Mathematica Answerの行に沿って)


3

Python、57バイト

f=lambda p,n,m:m and(1-p)*f(p,n,m-1)+p*f(p,n-1,m-1)or n<1

基本ケースを除く二項係数の再帰式はm==0、必要な成功の残りの数がforでn負でないかどうかを示します。その指数再帰ツリーのため、これは大きな入力で停止します。True/False1/0


大規模なケースでこの回答をテストするには、を使用してキャッシュを追加しfrom functools import lru_cache; f = lru_cache(None)(f)ます。
-orlp

@orlpありがとう、大規模なテストケースを確認しました。
xnor

3

Haskell、73バイト

g x=product[1..x];f p n m=sum[g m/g k/g(m-k)*p**k*(1-p)**(m-k)|k<-[n..m]]

3

MATLAB、78 71バイト

Luis Mendoのおかげで7バイト節約できました!

@(m,k,p)sum(arrayfun(@(t)prod((1:m)./[1:t 1:m-t])*p^t*(1-p)^(m-t),k:m))

ans(100,10,0.1)
0.5487

arrayfun関数は楽しいものではありませんが、それを取り除く方法は見つかりませんでした...



1

Pyth、20バイト

JEKEcsmgsm<O0QKJCGCG

オンラインでお試しください!

注:CGは、インタープリターが処理できない非常に大きな数です。そのため、試行回数は1000である^ T3に削減されました。したがって、リンクは不正確な結果を生成します。

純粋な確率論的アプローチを使用します。


この質問に対して確率論的なアプローチが有効だとは思いませんが、@ orlp
Sp3000

精度c内で高い確率で取得するには、1 / c ^ 2回の試行が必要です。したがって、小数点以下5桁で〜10 ^ 10になります。
xnor

CGは非常に大きな数です。実際、それはbase-256から10進数に変換された文字列「abc ... z」です。
漏れの修道女

2
「確率的」がランダムを意味する場合、どれだけ多くの実現を平均しても、正確な値を保証することはできませ。実際、結果は毎回異なります。
ルイスメンドー

2
結果が小数点以下5桁まで正確でない可能性は常にゼロではありません。したがって、要件を満たしていませんあなたの答えは少なくとも5桁まで正確でなければなりません
ルイスメンドー

1

JavaScript(ES7)、82バイト

(p,n,m)=>[...Array(++m)].reduce((r,_,i)=>r+(b=!i||b*m/i)*p**i*(1-p)**--m*(i>=n),0)

reduce!を使用して1バイトを保存しました 説明:

(p,n,m)=>               Parameters
 [...Array(++m)].       m+1 terms
  reduce((r,_,i)=>r+    Sum
   (b=!i||b*m/i)*       Binomial coefficient
   p**i*(1-p)**--m*     Probability
   (i>=n),              Ignore first n terms
   0)




0

TI-Basic、17バイト

10進数の10桁まで正確に、コードを増やして0から14桁まで調整できます。

Prompt P,N,M:1-binomcdf(M,P,N-1

0

Haskell、54バイト

(p%n)m|m<1=sum[1|n<1]|d<-m-1=(1-p)*(p%n)d+p*(p%(n-1))d

関数を定義します(%)。次のように呼び出し(%) 0.4 2 3ます。


n <= 0ではなくn <1。
ダミアン

0

Mathematica、48バイト

Sum[s^k(1-s)^(#3-k)#3~Binomial~k,{k,##2}]/.s->#&

可能性を計算するために二項分布の確率式を使用してk個のための成功をk個からn個までのM。シンボリックな合計を使用してエッジケースを処理します。ここで、sは実際の値pで後で置換される確率のシンボリック変数です。(s 0 = 1ですが、0 0は不定です。)

例

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.