मरो 100 रोल कोई चेहरा 20 से अधिक बार दिखाई देते हैं


11

मैं इस समस्या के आसपास अपना सिर लपेटने की कोशिश कर रहा हूं।
एक मर 100 बार लुढ़का हुआ है। 20 से अधिक बार किसी भी चेहरे के दिखाई देने की संभावना क्या है? मेरा पहला विचार द्विपद वितरण P (x) = 1 - 6 cmf (100, 1/6, 20) का उपयोग कर रहा था लेकिन यह स्पष्ट रूप से गलत है क्योंकि हम कुछ मामलों को एक से अधिक बार गिनते हैं। मेरा दूसरा विचार यह है कि सभी संभव रोल्स X1 + x2 + x3 + x4 + x5 + x6 = 100, जैसे कि xi <= 20 और बहुराष्ट्रीय कंपनियों को सम्‍मिलित करें, लेकिन यह बहुत कम्‍प्‍यूटरीली लगता है। अनुमानित समाधान भी मेरे लिए काम करेंगे।

जवाबों:


13

यह प्रसिद्ध जन्मदिन समस्या का एक सामान्यीकरण है : n=100 व्यक्तियों को, जिन्होंने =6 संभावनाओं के एक सेट के बीच यादृच्छिक, समान रूप से "जन्मदिन" वितरित किया है , क्या मौका है कि कोई जन्मदिन =20 व्यक्तियों से अधिक द्वारा साझा नहीं किया जाता है?

एक सटीक गणना से उत्तर (डबल परिशुद्धता के लिए)। मैं सिद्धांत को स्केच करूंगा और सामान्य एन , एम , डी के लिए कोड प्रदान करूंगा कोड के asymptotic समय है हे ( एन 2 लॉग ( ) ) जो यह जन्मदिन की बहुत बड़ी संख्या के लिए उपयुक्त बनाता है d और जब तक उचित प्रदर्शन प्रदान करता है n हजारों में है। उस समय, पोइसन सन्निकटन में चर्चा की गईकि 2 से अधिक लोगों को जन्मदिन के विरोधाभास का विस्तार करने केलिए ज्यादातर मामलों में अच्छा काम करना चाहिए।0.267747907805267n,,हे(n2लॉग())n


समाधान की व्याख्या

D -sided मर के स्वतंत्र रोल के परिणामों के लिए प्रायिकता जनरेटिंग फंक्शन (pgf) हैn

dnfn(x1,x2,,xd)=dn(x1+x2++xd)n.

के गुणांक इस बहुपद के विस्तार में जिन तरीकों का सामना की संख्या देता है मैं वास्तव में दिखाई दे सकता है मैं बार, मैं = 1 , 2 , ... , x1e1x2e2xdedieii=1,2,,d.

से अधिक नहीं करने के लिए हमारे हित सीमित किसी भी चेहरे से दिखावे का मूल्यांकन करने के लिए समान है n आदर्श सापेक्ष मैं द्वारा उत्पन्न एक्स मीटर + 1 1 , एक्स मीटर + 1 2 , ... , एक्स मीटर + 1 इस मूल्यांकन को करने के लिए, प्राप्त करने के लिए द्विपद प्रमेय का पुन: उपयोग करेंmfnIx1m+1,x2m+1,,xdm+1.

fn(x1,,xd)=((x1++xr)+(xr+1+xr+2++x2r))n=k=0n(nk)(x1++xr)(एक्सआर+1++एक्स2आर)n-=Σ=0n(n)(एक्स1,...,एक्सआर)n-(एक्सआर+1,...,एक्स2आर)

जब सम है। F ( d ) n = f n ( 1 , 1 , , 1 ) ( d पद) लिखना , हमारे पास है=2आरn()=n(1,1,...,1)

(ए)n(2आर)=Σ=0n(n)(आर)n-(आर)

जब विषम हो, तो एक अनुरूप अपघटन का उपयोग करें=2आर+1

n(एक्स1,...,एक्स)=((एक्स1++एक्स2आर)+एक्स2आर+1)n=Σ=0n(n)(एक्स1,...,एक्स2आर)n-(एक्स2आर+1),

दे रही है

(ख)n(2आर+1)=Σ=0n(n)(2आर)n-(1)

दोनों मामलों में, हम सब कुछ मोडुलो को भी कम कर सकते हैं , जिसे आसानी से शुरू किया जाता हैमैं

n(एक्सजे){एक्सnn0n>आधुनिकमैं,

पुनरावृत्ति के लिए शुरुआती मूल्य प्रदान करना,

n(1)={1n0n>

यह कुशल बनाता है कि चर को आर चर के दो समान आकार वाले समूहों में विभाजित करके और सभी चर मानों को 1 पर सेट करके , हमें केवल एक समूह के लिए एक बार सब कुछ का मूल्यांकन करना होगा और फिर परिणामों को संयोजित करना होगा। इसके लिए n + 1 शब्दों की गणना आवश्यक है, उनमें से प्रत्येक को संयोजन के लिए O ( n ) गणना की आवश्यकता है । हमें f ( r ) n को संग्रहीत करने के लिए 2D सरणी की भी आवश्यकता नहीं है , क्योंकि जब कंप्यूटिंग f ( d ) n , केवल fआर1,n+1हे(n)n(आर)n(), औरf ( 1 ) n की आवश्यकता है।n(आर)n(1)

कुल चरणों की संख्या के बाइनरी विस्तार में अंकों की संख्या से कम है (जो फूट को समान समूहों में सूत्र में विभाजित करता है ( a ) ) प्लस विस्तार में लोगों की संख्या (जो कि सभी बार एक अजीब गणना करता है मूल्य का सामना करना पड़ता है, सूत्र ( बी ) के आवेदन की आवश्यकता होती है । यह अभी भी ( लॉग ( डी ) ) कदम है।()()हे(लॉग())

में Rएक दशक पुरानी कार्य केंद्र पर काम 0.007 सेकंड में किया गया था। इस पोस्ट के अंत में कोड सूचीबद्ध है। यह संभावित ओवरफ्लो से बचने या बहुत अधिक बहने से बचने के लिए, स्वयं संभावनाओं के बजाय, संभावनाओं के लघुगणक का उपयोग करता है। यह समाधान में कारक को हटाने के लिए संभव बनाता है ताकि हम उन गणनाओं की गणना कर सकें जो संभाव्यता को रेखांकित करती हैं।-n

ध्यान दें कि इस प्रक्रिया के परिणामस्वरूप संभाव्यताओं के पूरे क्रम को , एक ही बार में गणना किया जा सकता है, जो आसानी से हमें यह अध्ययन करने में सक्षम बनाता है कि n के साथ संभावना कैसे बदलती है ।0,1,...,nn


अनुप्रयोग

tmultinom.full+1nहे(n2लॉग(n)लॉग())nn

#
# The birthday problem: find the number of people where the chance of
# a collision of `m+1` birthdays first exceeds `alpha`.
#
birthday <- function(m=1, d=365, alpha=0.50) {
  n <- 8
  while((p <- tmultinom.full(n, m, d))[n] > alpha) n <- n * 2
  return(p)
}

798birthday(7)

आकृति


365


कोड

# Compute the chance that in `n` independent rolls of a `d`-sided die, 
# no side appears more than `m` times.
#
tmultinom <- function(n, m, d, count=FALSE) tmultinom.full(n, m, d, count)[n+1]
#
# Compute the chances that in 0, 1, 2, ..., `n` independent rolls of a
# `d`-sided die, no side appears more than `m` times.
#
tmultinom.full <- function(n, m, d, count=FALSE) {
  if (n < 0) return(numeric(0))
  one <- rep(1.0, n+1); names(one) <- 0:n
  if (d <= 0 || m >= n) return(one)

  if(count) log.p <- 0 else log.p <- -log(d)
  f <- function(n, m, d) {                   # The recursive solution
    if (d==1) return(one)                    # Base case
    r <- floor(d/2)
    x <- double(f(n, m, r), m)               # Combine two equal values
    if (2*r < d) x <- combine(x, one, m)     # Treat odd `d`
    return(x)
  }
  one <- c(log.p*(0:m), rep(-Inf, n-m))      # Reduction modulo x^(m+1)
  double <- function(x, m) combine(x, x, m)
  combine <- function(x, y, m) {             # The Binomial Theorem
    z <- sapply(1:length(x), function(n) {   # Need all powers 0..n
      z <- x[1:n] + lchoose(n-1, 1:n-1) + y[n:1]
      z.max <- max(z)
      log(sum(exp(z - z.max), na.rm=TRUE)) + z.max
    })
    return(z)
  }
  x <- exp(f(n, m, d)); names(x) <- 0:n
  return(x)
}

उत्तर के साथ प्राप्त किया जाता है

print(tmultinom(100,20,6), digits=15)

.267747907805267


4

यादृच्छिक नमूना विधि

मैंने इस कोड को एक लाख बार के लिए 100 डाई थ्रो की नकल करते हुए आर में चलाया:

y <- प्रतिकृति (1000000, सभी (तालिका (नमूना: 1, 6, आकार = 100, प्रतिस्थापित = TRUE)) <= 20))

प्रतिकृति फ़ंक्शन के अंदर कोड का आउटपुट सही है यदि सभी चेहरे 20 गुना से कम या बराबर दिखाई देते हैं। y एक सदिश है जिसके 1 मिलियन मान सच्चे या गलत हैं।

कुल नं। 1 मिलियन से विभाजित y में सही मान आपकी इच्छा की संभावना के लगभग बराबर होना चाहिए। मेरे मामले में यह 266872/1000000 था, लगभग 26.6% की संभावना का सुझाव


3
ओपी के आधार पर, मुझे लगता है कि यह <20 के बजाय <= 20 होना चाहिए
klumbard

1
मैंने पोस्ट (दूसरी बार) संपादित की है, क्योंकि एडिट नोट रखना कभी-कभी पूरी पोस्ट को संपादित करने से कम स्पष्ट होता है। यदि आपको लगता है कि पोस्ट में इतिहास का पता लगाने के लिए उपयोगी है, तो इसे वापस करने के लिए स्वतंत्र महसूस करें। meta.stackexchange.com/questions/127639/…
Sextus Empiricus

4

जानवर बल गणना

यह कोड मेरे लैपटॉप पर कुछ सेकंड का है

total = 0
pb <- txtProgressBar(min = 0, max = 20^2, style = 3)
for (i in 0:20) {
  for (j in 0:20) {
    for (k in 0:20) { 
      for (l in 0:20) {
        for (m in 0:20) {
          n = 100-sum(i,j,k,l,m)
          if (n<=20) {
            total = total+dmultinom(c(i,j,k,l,m,n),100,prob=rep(1/6,6))
          }
        }
      }
    }
    setTxtProgressBar(pb, i*20+j) # update progression bar            
  }
}
total

आउटपुट: 0.2677479

लेकिन फिर भी यदि आप इन गणनाओं में से बहुत कुछ करना चाहते हैं या अधिक मूल्यों का उपयोग करना चाहते हैं, या केवल एक और अधिक सुंदर विधि प्राप्त करने के लिए एक अधिक प्रत्यक्ष विधि खोजना दिलचस्प है।

कम से कम यह गणना एक सरलीकृत गणना, लेकिन मान्य, अन्य (अधिक जटिल) तरीकों की जांच करने के लिए संख्या देती है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.