Ймовірність того, що щось станеться принаймні n з m разів


11

Напишіть програму чи функцію, яка з урахуванням ймовірності успіху p , число n та кількість випробувань m повертає шанс принаймні n успіхів із m випробувань.

Ваша відповідь повинна бути точною, принаймні до 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

Читає m , n та p (у такому порядку) як аргументи командного рядка. Спробуйте в Інтернеті!

Зауважимо, що цей підхід вимагає часу (2 м ) часу та пам'яті, тому він не є досить ефективним для тестових випадків, коли 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 байт перемикання на бета-розподіл (відповідно до @ Sp3000 Mathematica Answer)


3

Пітон, 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/Falseпо1/0 . Через експоненціальне дерево рекурсії це зупиняється на великих входах.


Щоб перевірити цю відповідь у великих випадках, додайте кешування за допомогою from functools import lru_cache; f = lru_cache(None)(f).
orlp

@orlp Дякую, я підтвердив великі тестові випадки.
xnor


3

MATLAB, 78 71 байт

Збережено 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 - дуже велика кількість, з якою перекладач не може впоратися. Тому кількість випробувань знизили до ^ Т3, що становить одну тисячу. Тому посилання дає неточний результат.

Використовує чистий імовірнісний підхід.


Я не думаю, що ймовірнісний підхід був би дійсним для цього питання, але нам доведеться запитати @orlp
Sp3000

Вам потрібно в порядку 1 / c ^ 2 випробувань потрапити в точність c з високою ймовірністю, так що це буде ~ 10 ^ 10 для п'яти знаків після коми.
xnor

CG - дуже велика кількість. Фактично, це рядок "abc ... z", перетворений з базової 256 в десяткову.
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)

Збережено 1 байт за допомогою використання reduce! Пояснення:

(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 десяткових знаків, можна налаштувати від 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

Математика, 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 невизначено.)

Приклад

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.