En az m kez olmak üzere bir şey olma olasılığı


11

Bir başarı olasılığı verilen, bir program ya da işlev Yazın p , bir dizi , n ve denemeler bir dizi m , şans eseri döner en azından N üzerinden başarıları m denemeleri.

Cevabınız ondalık basamaktan sonra en az 5 basamak olmalıdır.

Test senaryoları:

 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
Binom dağılımı okumamış olanlarımıza bir formül eklemek ister misiniz?
Sızdıran Rahibe

2
@KennyLau Üzgünüm, bu meydan okumanın bir parçası.
orlp

Yanıtlar:


3

Jöle , 15 14 bayt

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

M , n ve p'yi (bu sırayla) komut satırı bağımsız değişkenleri olarak okur . Çevrimiçi deneyin!

Not bu yaklaşım gerektirmektedir O (2 m ) değil, bu yüzden, zaman ve bellek oldukça verimli kadar test durumları için , m = 100 . Makinemde test durumu (m, n, p) = (20, 13, 0.5) yaklaşık 100 saniye sürüyor. Çevrimiçi yorumlayıcı için çok fazla bellek gerekiyor.

Nasıl çalışır

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.


6

R, 32 31 bayt

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

edit - 1 bayt beta dağıtımına geçiş (@ Sp3000 Mathematica Answer satırlarında)


3

Python, 57 bayt

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

Temel durum dışında binom katsayıları için özyinelemeli formül m==0, gerekli başarıların kalan sayısının forn ile negatif olup olmadığını gösterir . Üstel özyineleme ağacı nedeniyle, bu büyük girdiler üzerinde durur.True/False1/0


Bu cevabı büyük vakalarda test etmek için düğmesini kullanarak önbellek ekleyin from functools import lru_cache; f = lru_cache(None)(f).
orlp

@orlp Teşekkürler, büyük test senaryolarını doğruladım.
xnor

3

Haskell, 73 bayt

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 bayt

Luis Mendo sayesinde 7 bayt tasarruf etti!

@(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

Dizifun işlevi eğlenceli değil, ama ondan kurtulmanın bir yolunu bulamadım ...



1

Pyth, 20 bayt

JEKEcsmgsm<O0QKJCGCG

Çevrimiçi deneyin!

Not: CG, yorumlayıcının işleyemeyeceği çok büyük bir sayıdır. Bu nedenle, deneme sayısı bin olan ^ T3'e düşürüldü. Bu nedenle, bağlantı yanlış bir sonuç üretir.

Saf olasılıklı yaklaşım kullanır.


Bu soru için olasılıklı bir yaklaşımın geçerli olacağını düşünmüyorum, ancak @orlp
Sp3000

Yüksek olasılıkla c doğruluğu elde etmek için 1 / c ^ 2 deneme sırasına ihtiyacınız vardır, böylece beş ondalık basamak için ~ 10 ^ 10 olur.
xnor

CG çok büyük bir sayıdır. Aslında, taban-256'dan ondalığa dönüştürülen "abc ... z" dizesidir.
Leaky Nun

2
"Olasılıksal" rastgele anlamına gelirse , kaç gerçekleşme gerçekleştirdiğinizden bağımsız olarak doğru bir değeri garanti edemezsiniz . Aslında sonuç her seferinde farklı.
Luis Mendo

2
Her zaman sonucun 5 ondalık basamak için doğru olmadığı sıfır olmayan bir olasılık vardır. Bu nedenle bu gereksinimi karşılamıyor Cevabınız en az 5 rakama kadar kesin olmalıdır
Luis Mendo

1

JavaScript (ES7), 82 bayt

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

Kullanarak 1 bayt kaydedildi reduce! Açıklama:

(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 bayt

Hassas 10 ondalık, daha fazla kod ile 0-14 ondalık herhangi bir yerde ayarlanabilir.

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

0

Haskell, 54 bayt

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

Bir işlevi tanımlar (%). Şöyle deyin (%) 0.4 2 3.


n <= 0 yerine n <1.
Damien

0

Mathematica, 48 bayt

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

Şansını hesaplamak için binom dağılımı olasılık formülü kullanır k için başarılar k dan n için m . Sembolik bir miktar kullanılarak kenar durumlarda kolları s sonra gerçek değeri ile değiştirilir olasılık için sembolik bir değişkendir p . (Çünkü s 0 = 1, ancak 0 0 belirsizdir.)

Misal

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.