Яка очікувана кількість разів, коли потрібно скочувати штамп, поки кожна сторона не з’явиться 3 рази?
Це питання задавали в початковій школі Нової Зеландії, і це було вирішено за допомогою моделювання. Яке аналітичне рішення цієї проблеми?
Яка очікувана кількість разів, коли потрібно скочувати штамп, поки кожна сторона не з’явиться 3 рази?
Це питання задавали в початковій школі Нової Зеландії, і це було вирішено за допомогою моделювання. Яке аналітичне рішення цієї проблеми?
Відповіді:
Припустимо, всі сторін мають рівні шанси. Давайте узагальнимо і знайдемо очікувану кількість рулонів, необхідних до тих пір, поки сторона 1 не з’явиться n 1 разів, сторона 2 з’явилася n 2 рази, ..., а сторона d не з’явилася n d разів. Оскільки особистість сторін не має значення (всі вони мають однакові шанси), опис цієї мети може бути стислою: припустимо, що i 0 сторони взагалі не повинні з'являтися, i 1 з сторін повинен з'явитися тільки раз, ..., і ясторони повинні бути разів. Нехай i = ( i 0 , i 1 , ... , i n ) позначає цю ситуацію і записує e ( i ) для очікуваної кількості рулонів. Питання задає e ( 0 , 0 , 0 , 6 ) : i 3 =
Простий рецидив доступний. У наступному рулоні сторона, що з'являється, відповідає одному з : тобто нам це не потрібно було бачити, або нам потрібно було його побачити один раз, ... або нам потрібно було побачити його більше n разів. j - кількість разів, яку нам потрібно було переглянути.
Коли , нам не потрібно було його бачити, і нічого не змінюється. Це відбувається з ймовірністю i 0 / d .
Коли тоді нам потрібно було бачити цю сторону. Тепер є ще одна менша сторона, яку потрібно бачити j разів, і ще одна сторона, яку потрібно побачити j - 1 раз. Таким чином, i j стає i j - 1, а i j - 1 стає i j + 1 . Нехай цю операцію на компонентах i позначають i ⋅ j , так що
Це відбувається з ймовірністю .
Нам просто потрібно порахувати цей ролик і скористатися рекурсією, щоб сказати, скільки ще булочок очікується. За законами очікування та повної ймовірності,
(Давайте зрозуміємо, що коли , відповідний доданок у сумі дорівнює нулю.)
Якщо , ми закінчили і e ( i ) = 0 . Інакше ми можемо вирішити для e ( i ) , даючи бажану рекурсивну формулу
Зауважте, що - загальна кількість подій, які ми хочемо побачити. Операція ⋅ j зменшує цю величину на одиницю для будь-якого j > 0 за умови i j > 0 , що завжди має місце. Тому ця рекурсія закінчується на глибині точно | я | (дорівнює 3 ( 6 ) =
Я обчислюю, що
Це здалося мені жахливо малим, тому я запустив моделювання (використовуючи R
). Після понад трьох мільйонів рулонів кісток цю гру до кінця зіграли понад 100 000 разів, середня довжина . Стандартна похибка цієї оцінки становить 0,027 : різниця між цим середнім та теоретичним значенням незначна, що підтверджує точність теоретичного значення.
Розподіл довжин може представляти інтерес. (Очевидно, що вона повинна починатися о , мінімальна кількість рулонів, необхідних для збору всіх шести боків три рази.)
# Specify the problem
d <- 6 # Number of faces
k <- 3 # Number of times to see each
N <- 3.26772e6 # Number of rolls
# Simulate many rolls
set.seed(17)
x <- sample(1:d, N, replace=TRUE)
# Use these rolls to play the game repeatedly.
totals <- sapply(1:d, function(i) cumsum(x==i))
n <- 0
base <- rep(0, d)
i.last <- 0
n.list <- list()
for (i in 1:N) {
if (min(totals[i, ] - base) >= k) {
base <- totals[i, ]
n <- n+1
n.list[[n]] <- i - i.last
i.last <- i
}
}
# Summarize the results
sim <- unlist(n.list)
mean(sim)
sd(sim) / sqrt(length(sim))
length(sim)
hist(sim, main="Simulation results", xlab="Number of rolls", freq=FALSE, breaks=0:max(sim))
R
E
%.%
x <- (d + sum(sapply(1:n, function(i) j[i+1]*e.(j %.% i))))/(d - j[1])
R
.
e(c(0,0,0,6))
32.6771634160506
Накопичена помилка округлення з плаваючою комою знищила дві останні цифри (що має бути, 68
а не 06
).
e <- function(i) {
#
# Create a data structure to "memoize" the values.
#
`[[<-.AA` <- function(x, i, value) {
class(x) <- NULL
x[[paste(i, collapse=",")]] <- value
class(x) <- "AA"
x
}
`[[.AA` <- function(x, i) {
class(x) <- NULL
x[[paste(i, collapse=",")]]
}
E <- list()
class(E) <- "AA"
#
# Define the "." operation.
#
`%.%` <- function(i, j) {
i[j+1] <- i[j+1]-1
i[j] <- i[j] + 1
return(i)
}
#
# Define a recursive version of this function.
#
e. <- function(j) {
#
# Detect initial conditions and return initial values.
#
if (min(j) < 0 || sum(j[-1])==0) return(0)
#
# Look up the value (if it has already been computed).
#
x <- E[[j]]
if (!is.null(x)) return(x)
#
# Compute the value (for the first and only time).
#
d <- sum(j)
n <- length(j) - 1
x <- (d + sum(sapply(1:n, function(i) j[i+1]*e.(j %.% i))))/(d - j[1])
#
# Store the value for later re-use.
#
E[[j]] <<- x
return(x)
}
#
# Do the calculation.
#
e.(i)
}
e(c(0,0,0,6))
Нарешті, ось оригінальна реалізація Mathematica, яка дала точну відповідь. Запам'ятовування здійснюється за допомогою ідіоматичного e[i_] := e[i] = ...
виразу, виключаючи майже всі R
попередні позначення . Внутрішнє, однак, обидві програми роблять однакові речі однаково.
shift[j_, x_List] /; Length[x] >= j >= 2 := Module[{i = x},
i[[j - 1]] = i[[j - 1]] + 1;
i[[j]] = i[[j]] - 1;
i];
e[i_] := e[i] = With[{i0 = First@i, d = Plus @@ i},
(d + Sum[If[i[[k]] > 0, i[[k]] e[shift[k, i]], 0], {k, 2, Length[i]}])/(d - i0)];
e[{x_, y__}] /; Plus[y] == 0 := e[{x, y}] = 0
e[{0, 0, 0, 6}]
Оригінальна версія цього питання розпочала життя, задавши:
скільки рулонів потрібно, поки кожна сторона не з’явиться 3 рази
Розподіл необхідної кількості рулонів ... такий, що кожна сторона з’являється 3 рази
Let: Then the cdf of is:
i.e. To find the cdf , simply calculate for each value of :
Here, for example, is Mathematica code that does this, as increases from 18 to say 60. It is basically a one-liner:
cdf = ParallelTable[
Probability[x1 >= 3 && x2 >= 3 && x3 >= 3 && x4 >= 3 && x5 >= 3 && x6 >= 3,
{x1, x2, x3, x4, x5, x6} \[Distributed] MultinomialDistribution[n, Table[1/6, 6]]],
{n, 18, 60}]
... що дає точний cdf як збільшується:
Ось сюжет cdf , як функція :
Вивести пмф , просто перша різниця у форматі PDF:
Звичайно, розподіл не має верхньої межі, але ми можемо легко вирішити тут стільки значень, скільки практично потрібно. Підхід загальний і повинен працювати так само добре для будь-якої необхідної комбінації сторін.