m发生至少n次的概率


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
您是否愿意为尚未研究二项式分布的人提供一个公式?
Leaky Nun

2
@KennyLau对不起,这是挑战的一部分。
orlp

Answers:


3

果冻15 14 字节

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

读取mnp(按此顺序)作为命令行参数。在线尝试!

请注意,此方法需要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.


6

R,32 31字节

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

编辑-1字节切换到beta发行版(沿@ 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指示需要成功的剩余数量是否n是非负的,具有True/False1/0。由于它的指数递归树,它在大量输入时停滞。


要在大多数情况下测试此答案,请使用添加缓存from functools import lru_cache; f = lru_cache(None)(f)
Orlp '16

@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是很大的数字,解释器无法处理。因此,试验次数已降至^ T3,即一千次。因此,链接产生不正确的结果。

使用纯概率方法。


我认为概率方法不能解决这个问题,但我们不得不问@orlp
Sp3000,2016年

您需要大约1 / c ^ 2次试验才能以较高的概率达到准确度c,因此,对于五个小数位,它约为10 ^ 10。
xnor

CG非常大。实际上,它是从基数256转换为十进制的字符串“ abc ... z”。
Leaky Nun

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基本(17字节)

精确到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 <1而不是n <= 0。
达米安

0

Mathematica,48个字节

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

使用二项分布概率公式来计算knmk次成功的机会。通过使用符号和来处理边缘情况,其中s是用于概率的符号变量,之后被实际值p代替。(因为s 0 = 1但0 0不确定。)

例

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.