Chết 100 cuộn không có mặt xuất hiện hơn 20 lần


11

Tôi đang cố gắng để giải quyết vấn đề này.
Một con súc sắc được lăn 100 lần. Xác suất không có khuôn mặt xuất hiện hơn 20 lần là gì? Suy nghĩ đầu tiên của tôi là sử dụng phân phối Binomial P (x) = 1 - 6 cmf (100, 1/6, 20) nhưng điều này rõ ràng là sai vì chúng tôi đếm một số trường hợp nhiều lần. Ý tưởng thứ hai của tôi là liệt kê tất cả các cuộn có thể x1 + x2 + x3 + x4 + x5 + x6 = 100, sao cho xi <= 20 và tính tổng các đa thức nhưng điều này có vẻ quá chuyên sâu về mặt tính toán. Các giải pháp gần đúng cũng sẽ làm việc cho tôi.

Câu trả lời:


13

Đây là một khái quát của Vấn đề sinh nhật nổi tiếng : được cá nhân có "sinh nhật" được phân phối đồng đều, ngẫu nhiên trong số các tập hợp , khả năng không có sinh nhật nào được chia sẻ bởi hơn cá nhân?d = 6 m = 20n=100d=6m=20

Một phép tính chính xác mang lại câu trả lời (để tăng gấp đôi độ chính xác). Tôi sẽ phác thảo lý thuyết và cung cấp mã cho Thời gian tiệm cận mã là mà làm cho nó phù hợp với số lượng rất lớn các sinh nhật và cung cấp hiệu suất hợp lý cho đến khi là trong hàng ngàn. Tại thời điểm đó, phép tính gần đúng Poisson đã thảo luận tại Mở rộng nghịch lý sinh nhật cho hơn 2 người nên hoạt động tốt trong hầu hết các trường hợp.n , m , d . O ( n 2 log ( d ) ) d n0.267747907805267n,m,d.O(n2log(d))dn


Giải thích về giải pháp

Hàm tạo xác suất (pgf) cho kết quả của cuộn độc lập của một khuôn mặt làdnd

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

Hệ số của trong việc mở rộng đa thức này đưa ra số cách mà khuôn mặt có thể xuất hiện chính xác lần , i đ i i = 1 , 2 , ... , d .x1e1x2e2xdedieii=1,2,,d.

Giới hạn sự quan tâm của chúng tôi không quá xuất hiện bởi bất kỳ khuôn mặt nào tương đương với việc đánh giá modulo lý tưởng tạo bởi Để thực hiện đánh giá này, hãy sử dụng Định lý nhị thức để thu đượcf n I x m + 1 1 , x m + 1 2 , Mạnh , x m + 1 d .mfnIx1m+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)

khi là chẵn. Viết ( thuật ngữ ), chúng tôi cód=2rfn(d)=fn(1,1,,1)d

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

Khi là số lẻ, hãy sử dụng phân tách tương tựd=2r+1

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

cho

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

Trong cả hai trường hợp, chúng tôi cũng có thể giảm mọi thứ modulo , dễ dàng thực hiện bắt đầu bằngI

fn(xj){xnnm0n>mmodI,

cung cấp các giá trị khởi đầu cho đệ quy,

fn(1)={1nm0n>m

Điều làm cho hiệu quả này là bằng cách chia các biến thành hai nhóm có kích thước bằng nhau mỗi biến và đặt tất cả các giá trị biến thành chúng ta chỉ phải đánh giá mọi thứ một lần cho một nhóm và sau đó kết hợp các kết quả. Điều này đòi hỏi phải tính toán tối đa thuật ngữ, mỗi thuật ngữ cần tính toán cho sự kết hợp. Chúng tôi thậm chí không cần một mảng 2D để lưu trữ , bởi vì khi tính toán chỉ và .dr1,n+1O(n)fn(r)fn(d),fn(r)fn(1)

Tổng số bước là một ít hơn số chữ số trong khai triển nhị phân của (tính các phần tách thành các nhóm bằng nhau trong công thức ) cộng với số lượng trong phần mở rộng (tính tất cả các lần lẻ giá trị gặp phải, yêu cầu áp dụng công thức ). Đó vẫn chỉ là các bước .d(a)(b)O(log(d))

Trong Rmột máy trạm cũ hàng thập kỷ, công việc được thực hiện trong 0,007 giây. Mã được liệt kê ở cuối bài này. Nó sử dụng logarit của xác suất, thay vì chính xác suất, để tránh tràn ra ngoài hoặc tích lũy quá nhiều dòng chảy. Điều này cho phép loại bỏ yếu tố trong giải pháp để chúng tôi có thể tính toán các số liệu làm cơ sở cho xác suất.dn

Lưu ý rằng quy trình này dẫn đến việc tính toán toàn bộ chuỗi xác suất cùng một lúc, điều này dễ dàng cho phép chúng tôi nghiên cứu cách cơ hội thay đổi với .f0,f1,,fnn


Các ứng dụng

Phân phối trong Bài toán sinh nhật tổng quát được tính theo hàm tmultinom.full. Thách thức duy nhất nằm ở việc tìm ra giới hạn trên cho số lượng người phải có mặt trước khi cơ hội của tỷ lệ trở nên quá lớn. Đoạn mã sau thực hiện điều này bằng sức mạnh vũ phu, bắt đầu bằng nhỏ và nhân đôi cho đến khi nó đủ lớn. Do đó, toàn bộ tính toán mất thời gian trong đó là giải pháp. Toàn bộ phân phối xác suất cho số người lên đến được tính toán.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)
}

Ví dụ, số người tối thiểu cần thiết trong một đám đông để làm cho nhiều khả năng hơn là ít nhất tám người trong số họ chia sẻ một sinh nhật là , như tính toán tìm thấy . Chỉ mất vài giây. Đây là một phần của một phần của đầu ra:798birthday(7)

Nhân vật


Một phiên bản đặc biệt của vấn đề này được đề cập tại Mở rộng nghịch lý sinh nhật cho hơn 2 người , liên quan đến trường hợp một cái chết mặt được cuộn rất nhiều lần.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)
}

Câu trả lời có được với

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

0.267747907805267


4

Phương pháp lấy mẫu ngẫu nhiên

Tôi đã chạy mã này trong R sao chép 100 lần ném chết trong một triệu lần:

y <- sao chép (1000000, tất cả (bảng (mẫu (1: 6, kích thước = 100, thay thế = TRUE)) <= 20))

Đầu ra của mã bên trong hàm sao chép là đúng nếu tất cả các mặt xuất hiện nhỏ hơn hoặc bằng 20 lần. y là một vectơ có 1 triệu giá trị đúng hoặc sai.

Tổng số không. giá trị thực trong y chia cho 1 triệu nên xấp xỉ bằng xác suất bạn mong muốn. Trong trường hợp của tôi, nó là 266872/1000000, cho thấy xác suất khoảng 26,6%


3
Dựa trên OP, tôi nghĩ rằng nó nên là <= 20 chứ không phải <20
klumbard

1
Tôi đã chỉnh sửa bài đăng (lần thứ hai) vì việc đặt ghi chú chỉnh sửa đôi khi không rõ ràng hơn so với chỉnh sửa toàn bộ bài đăng. Vui lòng hoàn nguyên nó nếu bạn nghĩ rằng nó hữu ích để giữ dấu vết của lịch sử trong bài viết. meta.stackexchange.com/questions/127639/ Mạnh
Sextus Empiricus

4

Tính toán lực lượng vũ phu

Mã này mất vài giây trên máy tính xách tay của tôi

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

sản lượng: 0.2677479

Nhưng vẫn có thể thú vị khi tìm một phương pháp trực tiếp hơn trong trường hợp bạn muốn thực hiện nhiều phép tính này hoặc sử dụng các giá trị cao hơn hoặc chỉ vì mục đích có được một phương thức thanh lịch hơn.

Ít nhất tính toán này đưa ra một con số được tính toán đơn giản, nhưng hợp lệ, để kiểm tra các phương thức khác (phức tạp hơn).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.