ডাই 100 রোলগুলি 20 বারের বেশি প্রদর্শিত হবে না


11

আমি এই সমস্যাটি ঘিরে আমার মাথা গুটিয়ে দেওয়ার চেষ্টা করছি।
একটি ডাই 100 বার ঘূর্ণিত হয়। কোনও মুখের 20 বারের বেশি উপস্থিত হওয়ার সম্ভাবনা কত? আমার প্রথম চিন্তাটি দ্বিপদী বিতরণ পি (এক্স) = 1 - 6 সেন্টিমিটার (100, 1/6, 20) ব্যবহার করছিল তবে এটি স্পষ্টতই ভুল কারণ আমরা কয়েকটি ক্ষেত্রে একাধিকবার গণনা করি। আমার দ্বিতীয় ধারণাটি হ'ল সম্ভাব্য সমস্ত রোলগুলি x1 + x2 + x3 + x4 + x5 + x6 = 100, যেমন xi <= 20 এবং বহু-জাতীয় যোগফলের যোগফল গণনা করা কিন্তু এটি খুব কম গণনামূলকভাবে নিবিড় বলে মনে হয়। আনুমানিক সমাধানগুলিও আমার পক্ষে কাজ করবে।

উত্তর:


13

এটি বিখ্যাত জন্মদিন সমস্যার একটি জেনারালাইজেশন : প্রদত্ত জন ব্যক্তি যারা সম্ভাবনার সেটগুলির মধ্যে এলোমেলোভাবে, অভিন্নভাবে "জন্মদিন" বিতরণ করেছেন, জনের বেশি ব্যক্তি কোনও জন্মদিন ভাগ না করার সুযোগ কী ?n=100d=6m=20

একটি সঠিক গণনা answer (ডাবল স্পষ্টতা থেকে) উত্তর দেয়। আমি তত্ত্বটি স্কেচ করব এবং সাধারণ কোডের মধ্যে asymptotic সময়জ্ঞান হয় যা জন্মদিন খুব বড় সংখ্যার জন্য উপযুক্ত করে তোলে এবং যতক্ষণ যুক্তিসংগত কর্মক্ষমতা উপলব্ধ হাজার হাজার আছে। এই মুহুর্তে, জন্মদিনের প্যারাডক্সটি 2 টিরও বেশি লোকের বাড়ানোয় আলোচিত পয়সন আনুমানিকতার বেশিরভাগ ক্ষেত্রেই ভালভাবে কাজ করা উচিত।এন , মি , ডি ( এন 2 লগ ( ডি ) ) ডি এন0.267747907805267n,m,d.O(n2log(d))dn


সমাধানের ব্যাখ্যা

সাইড ডাইয়ের স্বতন্ত্র রোলগুলির ফলাফলের জন্য সম্ভাব্যতা উত্পন্ন ফাংশন (পিজিএফ) হয়dnd

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

এই ঠিক বার প্রদর্শিত হতে পারে তার সংখ্যা দেয় , i e i i = 1 , 2 , , d x1e1x2e2xdedieii=1,2,,d.

বেশী আমাদের সুদ সীমিত কোনো মুখের ভিত্তিতে চেহারাগুলো মূল্যায়নের শামিল কিনা মডিউল আদর্শ দ্বারা উত্পন্ন এই মূল্যায়নটি সম্পাদন করতে, দ্বিপদী তত্ত্বটি পুনরাবৃত্তভাবে প্রাপ্ত করতে ব্যবহার করুনf n I x m + 1 1 , x m + 1 2 , , x m + 1 dmfnIx1m+1,x2m+1,,xdm+1.

fn(x1,,xd)=((x1++xr)+(xr+1+xr+2++x2r))n=k=0n(nk)(x1++xr)k(xr+1++x2r)nk=k=0n(nk)fk(x1,,xr)fnk(xr+1,,x2r)

যখন হয়। লিখন ( পদ), আমরা আছেd=2rfn(d)=fn(1,1,,1)d

(a)fn(2r)=k=0n(nk)fk(r)fnk(r).

যখন টি বিজোড় হয়, তখন অভিন্ন পচন ব্যবহার করুনd=2r+1

fn(x1,,xd)=((x1++x2r)+x2r+1)n=k=0n(nk)fk(x1,,x2r)fnk(x2r+1),

দান

(b)fn(2r+1)=k=0n(nk)fk(2r)fnk(1).

উভয় ক্ষেত্রেই আমরা মডিউল- সমস্ত কিছু হ্রাস করতে যা সহজেই শুরু করা হয়I

fn(xj){xnnm0n>mmodI,

পুনরাবৃত্তি জন্য প্রারম্ভিক মান প্রদান,

fn(1)={1nm0n>m

এই কার্যকরী করে তোলে যে বিভাজন হয় দুটি গ্রুপ একই আকারের মধ্যে ভেরিয়েবল ভেরিয়েবল প্রতিটি এবং সব পরিবর্তনশীল মান নির্ধারণের আমরা কেবল সবকিছু নির্ণয় করা আছে একবার এক দলের জন্য এবং তারপর একত্রিত ফলাফল নেই। এর জন্য পদগুলি পর্যন্ত কম্পিউটিং করা প্রয়োজন, তাদের প্রত্যেকটির সংমিশ্রণের জন্য গণনা প্রয়োজন । এমনকি store সঞ্চয় করার জন্য আমাদের 2 ডি লাগবে না , কারণ গণনা করার সময় কেবল এবং । প্রয়োজনdr1,n+1O(n)fn(r)fn(d),fn(r)fn(1)

ধাপের মোট সংখ্যা বাইনারি সম্প্রসারণ ডিজিটের সংখ্যার চেয়ে এক কম (যা সূত্র সমান দলে টুকরা বড়, মোট ছাত্র ) প্লাস সম্প্রসারণ মধ্যে বেশী নম্বর (যা বার একটি বিজোড় সব বড়, মোট ছাত্র সূত্র এর প্রয়োগের জন্য মানটির সম্মুখীন হয় । এটি এখনও কেবল পদক্ষেপ।d(a)(b)O(log(d))

ইন Rএক দশক বয়সী ওয়ার্কস্টেশন কাজ 0,007 সেকেন্ডের মধ্যে করা হয়েছিল। কোডটি এই পোস্টের শেষে তালিকাভুক্ত করা হয়েছে। এটি সম্ভাব্যতার চেয়ে লগারিদমগুলি সম্ভাব্যতার চেয়ে বরং সম্ভাব্য ওভারফ্লোগুলি বা অত্যধিক আন্ডারফ্লো এড়াতে ব্যবহার করে। এটি সমাধানের ফ্যাক্টরটি সরিয়ে ফেলা সম্ভব করে তোলে যাতে আমরা সম্ভাব্যতাগুলি বিবেচনা করে এমন গণনাগুলি গণনা করতে পারি।dn

নোট করুন যে এই প্রক্রিয়াটির ফলস্বরূপ সম্ভাব্যতার পুরো ক্রমটি একবারে গণনা করার ফলস্বরূপ , যা আমাদের সহজেই কীভাবে দিয়ে সম্ভাবনা পরিবর্তন করে তা অধ্যয়ন করতে সক্ষম করে ।f0,f1,,fnn


অ্যাপ্লিকেশন

সাধারণীকৃত জন্মদিনের সমস্যায় বিতরণটি ফাংশন দ্বারা গণনা করা হয় tmultinom.full। একমাত্র চ্যালেঞ্জটি এমন লোকের সংখ্যার জন্য একটি উচ্চতর সীমা নির্ধারণে অন্তর্ভুক্ত যারা -কোলিশনের সম্ভাবনা খুব দুর্দান্ত হয়ে ওঠার আগে উপস্থিত থাকতে হবে । নীচের কোডটি নিখুঁত বল দ্বারা এটি করে, ছোট দিয়ে শুরু করে এবং এটি যথেষ্ট বড় না হওয়া পর্যন্ত দ্বিগুণ করে। সম্পূর্ণ গণনাটি সময় নেয় যেখানে হল সমাধান। মাধ্যমে সংখ্যক লোকের জন্য সম্ভাবনার সম্পূর্ণ বিতরণ গণনা করা হয়।m+1nO(n2log(n)log(d))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)

ব্যক্তিত্ব


এই সমস্যাটির একটি বিশেষ সংস্করণ 2 টিরও বেশি লোকের কাছে জন্মদিনের প্যারাডক্সকে বাড়ানোর সময় সম্বোধন করা হয়েছে , যা একটি পক্ষীয় মরণের ক্ষেত্রে উদ্বেগ প্রকাশ করে যা খুব বড় সংখ্যক বার ঘূর্ণিত হয়।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)

0,267747907805267


4

এলোমেলো নমুনা পদ্ধতি

আমি এই কোডটি দশ মিলিয়ন বারের জন্য 100 ডাই থ্রো-এর প্রতিরূপে চালিয়েছি:

y <- প্রতিলিপি করুন (1000000, সমস্ত (সারণী (নমুনা (1: 6, আকার = 100, প্রতিস্থাপন = সত্য)) <= 20))

প্রতিলিপি ফাংশনের অভ্যন্তরের কোডের আউটপুটটি সত্য যদি সমস্ত মুখগুলি 20 বারের চেয়ে কম বা সমান প্রদর্শিত হয়। y সত্য বা মিথ্যা এর 10 মিলিয়ন মান সহ একটি ভেক্টর।

মোট নং। 1 মিলিয়ন দ্বারা বিভক্ত y এর সত্যিকারের মানগুলি আপনার সম্ভাব্যতার চেয়ে প্রায় সমান হওয়া উচিত। আমার ক্ষেত্রে এটি 266872/1000000 ছিল, প্রায় 26.6% এর সম্ভাব্যতার প্রস্তাব দেয়



1
আমি পোস্টটি দ্বিতীয়বার সম্পাদিত করেছি কারণ একটি সম্পাদনা নোট স্থাপন কখনও কখনও পুরো পোস্টটি সম্পাদনার চেয়ে কম পরিষ্কার হয় clear ইতিহাসের সন্ধান পোস্টে রাখার জন্য আপনি যদি দরকারী মনে করেন তবে এটিকে পুনরায় ফেরাতে দ্বিধা বোধ করবেন না। 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

তবে আপনি যদি এই হিসাবগুলি প্রচুর করতে চান বা উচ্চতর মান ব্যবহার করতে চান বা কেবল একটি আরও মার্জিত পদ্ধতি অর্জনের প্রয়োজনে তবে আরও সরাসরি কোনও পদ্ধতি খুঁজে পাওয়া আকর্ষণীয় হতে পারে।

কমপক্ষে এই গণনাটি সরলভাবে গণনা করা হলেও বৈধ, অন্যান্য (আরও জটিল) পদ্ধতিগুলি পরীক্ষা করার জন্য নম্বর দেয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.