Ожидаемое количество бросков костей требует, чтобы сумма была больше или равна K?

9

6-сторонняя матрица катится итеративно. Какое ожидаемое количество бросков требуется, чтобы сумма была больше или равна K?

Перед редактированием

P(Sum>=1 in exactly 1 roll)=1
P(Sum>=2 in exactly 1 roll)=5/6
P(Sum>=2 in exactly 2 rolls)=1/6
P(Sum>=3 in exactly 1 roll)=5/6
P(Sum>=3 in exactly 2 rolls)=2/6
P(Sum>=3 in exactly 3 rolls)=1/36
P(Sum>=4 in exactly 1 roll)=3/6
P(Sum>=4 in exactly 2 rolls)=3/6
P(Sum>=4 in exactly 3 rolls)=2/36
P(Sum>=4 in exactly 4 rolls)=1/216

После редактирования

P(Sum>=1 in atleast 1 roll)=1
P(Sum>=2 in atleast 1 roll)=5/6
P(Sum>=2 in atleast 2 rolls)=1
P(Sum>=3 in atleast 1 roll)=4/6
P(Sum>=3 in atleast 2 rolls)=35/36
P(Sum>=3 in atleast 3 rolls)=1
P(Sum>=4 in atleast 1 roll)=3/6
P(Sum>=4 in atleast 2 rolls)=33/36
P(Sum>=4 in atleast 3 rolls)=212/216
P(Sum>=4 in atleast 4 rolls)=1

Я не уверен, что это правильно в первую очередь, но я думаю, что эта вероятность связана с ожидаемым количеством бросков?

Но я не знаю, как действовать дальше. Я иду в правильном направлении?

Обычно подозреваемый
источник
Как вы получили ? P(S2 in 2 rolls)
Glen_b
@Glen_b Вы должны получить число меньше 2 в первом броске, которое равно 1. Таким образом, вероятность получения 1 равна 1/6, а второй бросок может быть любым числом. если вы получите число, большее или равное 2, в первом броске, то вы не пойдете на второй бросок.
Обычный Подозреваемый
1
Ах, я вижу, что происходит. Вы не описываете это как "P (S \ geq 2 in 2 rolls)"; это выражение подразумевает фиксированное количество бросков. Вам нужно либо «P (ровно 2 рулона, чтобы получить )», либо «P (минимум 2 рулона, чтобы получить S 2 )». S2S2
Glen_b
@Glen_b Да, это путаница. P (ровно 2 броска, чтобы получить S> 2), я думаю. Все, что я в конечном итоге хочу вычислить, это ожидаемое количество бросков, чтобы достичь суммы, превышающей K?
Обычный Подозреваемый
@Glen_b я должен использовать по крайней мере или именно для этой цели? А как рассчитать ожидаемое количество рулонов на большую сумму вроде 10000?
Обычный подозреваемый

Ответы:

2

Пока это только некоторые идеи для другого, более точного подхода, основанного на том же наблюдении, что и мой первый ответ. Со временем я буду расширять это ...

Сначала немного обозначений. Пусть некоторое заданное положительное (большое) целое число. Мы хотим , чтобы распределение N , которое является минимальным количеством бросков Обыкновенных костей , чтобы получить сумму по крайней мере K . Итак, сначала мы определяем X i как результат броска костей i , а X ( n ) = X 1 + + X n . Если мы можем найти распределение X ( n ) для всех n, то мы можем найти распределение N , используя P ( N KNKXiiX(n)=X1++XnX(n)nN и все готово.

P(Nn)=P(X1++XnK),

Теперь возможными значениями для являются n , n + 1 , n + 2 , , 6 n и для k в этом диапазоне, чтобы найти вероятность P ( X 1 + + X n = k ) нам нужно найти общее количество способов записать k как сумму ровно n целых чисел, все в диапазоне 1 , 2 , X1++Xnn,n+1,n+2,,6nkP(X1++Xn=k)kn . Но это называется ограниченная целочисленная композиция, проблема, хорошо изученная в комбинаторике. Некоторые связанные вопросы по математике SE можно найти по адресу https://math.stackexchange.com/search?q=integer+compositions.1,2,,6

Поэтому, ища и изучая эту литературу по комбинаторике, мы можем получить точные результаты. Я буду следить за этим, но позже ...

Къетил б Халворсен
источник
2

Существует простая замкнутая формула в терминах корней многочлена степени 6.

На самом деле немного проще рассмотреть обычный честный кристалл с d2 гранями, помеченными номерами 1,2,,d.

Пусть ek будет ожидаемым числом бросков, необходимым для того, чтобы равняться или превышать k. Для k0, ek=0. В противном случае ожидание на единицу больше, чем ожидание количества бросков для достижения непосредственно предшествующего значения, которое будет среди kd,kd+1,,k1, откуда

(1)ek=1+1d(ekd+ekd+1++ek1).

Это линейное рекуррентное соотношение имеет решение в виде

(2)ek=2kd+1+i=1daiλik

где λi - d комплексные корни многочлена

(3)Td1d(Td1+Td2++T+1).

Константы ai находятся путем применения решения (2) к значениям k=(d1),(d2),,1,0 где ek=0 в каждом случае. Это дает набор d линейных уравнений по d константам и имеет единственное решение. То, что решение работает, может быть продемонстрировано проверкой повторения (1)используя тот факт, что каждый корень удовлетворяет (3):

1+1dj=1dekj=1+1dj=1d(2(kj)d+1+i=1daiλikj)=2kd+1+i=1daiλikd[1d(1+λi++λid1)]=2kd+1+i=1daiλikdλid=2kd+1+i=1daiλik=ek.

Это решение в закрытой форме дает нам хорошие способы приблизить ответ, а также оценить его точно. (Для малых и умеренных значений k, непосредственное применение рецидива является эффективной вычислительной техникой). Например, при d=6 мы можем легко вычислить

e1000000=285714.761905

Для приближений будет существовать единственный наибольший корень λ+=1 поэтому в конечном итоге (при достаточно большом k ) член λ+k будет доминировать над d членами в (2).Ошибка будет экспоненциально уменьшаться в соответствии со второй наименьшей нормой корней. Продолжая пример с k=6, коэффициент λ+ представляет + = 0,4761905 , а следующий-наименьшая норма 0,7302500. (Кстати, другойa+=0.47619050.7302500.ai склонен быть очень близким к1 размеру.) Таким образом, мы можем приблизить предыдущее значение как

e10000002×1066+1+0.4761905=285714.761905

с ошибкой порядка 0.730250010610314368.


Чтобы продемонстрировать, насколько практичным является это решение, ниже приведен Rкод, который возвращает функцию для оценки ek для любого k (в рамках вычислений с плавающей запятой двойной точности) и не слишком большого d (оно уменьшится, когда d100 ):

die <- function(d, mult=1, cnst=1, start=rep(0,d)) {
  # Create the companion matrix (its eigenvalues are the lambdas).
  X <- matrix(c(0,1,rep(0,d-1)),d,d+1)
  X[, d] <- mult/d
  lambda <- eigen(X[, 1:d], symmetric=FALSE, only.values=TRUE)$values

  # Find the coefficients that agree with the starting values.
  u <- 2*cnst/(d+1)
  a <- solve(t(outer(lambda, 1:d, `^`)), start - u*((1-d):0))

  # This function assumes the starting values are all real numbers.
  f <- Vectorize(function(i) Re(sum(a * lambda ^ (i+d))) + u*i)

  list(f=f, lambda=lambda, a=a, multiplier=mult, offset=cnst)
}

В качестве примера его использования здесь рассчитываются ожидания для k=1,2,,16:

round(die(6)$f(1:10), 3)

1.000 1.167 1.361 1.588 1.853 2.161 2.522 2.775 3.043 3.324 3.613 3.906 4.197 4.476 4.760 5.046

Возвращаемый объект включает в себя корни λi и их множители ai для дальнейшего анализа. Первым компонентом массива множителей является полезный коэффициент a+.

(Если вам интересно, для чего предназначены другие параметры die, выполните die(2, 2, 0, c(1,0))$f(1:10)и посмотрите, распознаете ли вы вывод ;-). Это обобщение помогло в разработке и тестировании функции.)

Whuber
источник
+1. Функция dieвыдает ошибку для меня object 'phi' not found.
COOLSerdash
1
@COOL Спасибо за проверку. Виновным было изменение имени переменной (с phiна a) в последнюю минуту для соответствия тексту. Я исправил (и проверил) это.
whuber
1

нет никакого способа получить точное ожидаемое количество бросков в целом, кроме как для К.

Пусть N будет событием ожидаемого броска, чтобы получить сумму => K.

для K = 1, E (N) = 1

для K = 2, E(N)=(56+21)/(56+1)=1711

и так далее.

Например, будет сложно получить E (N) для большого K. Например, для K = 20 вам нужно ожидать (4 броска, 20 бросков)

K(Sum) follows N(3.5N,35N12)

K3.5N35N12=Zα
α=1confidenceZ0.01=2.31,Z0.001=2.98

Вы знаете K, Z (при любой ошибке) ........ тогда вы можете получить N = E (N) с некоторым доверительным процентом, решая уравнение.

Хемант Рупани
источник
2
Как вы рассчитали эти вероятности? Как вы пришли к этому уравнению E (N)?
Обычный Подозреваемый
@UsualSuspect P (Sum> = 2 в 1 броске) = 5/6 (вы знаете) P (Sum> = 2 в 2 бросках) = 1 (потому что вы должны получить сумму как минимум 2 из 2 бросков) и для E (N ) ......... это просто ожидаемое среднее значение
Хемант Рупани
Извините, я не упомянул. Это не по крайней мере, ровно 2 рулона. Теперь я понял уравнение E (N).
Обычный Подозреваемый
@UsualSuspect ооо! Кстати, если вам нужно E (N) для любого конкретного K, то я могу сделать это :).
Хемант Рупани
мне нужно для к = 20 и к = 10000. Лучше, если вы объясните мне, а не прямо дадите ответы.
Обычный Подозреваемый
0

XiiNk

P(Nn)=P(X1+X2++Xnk)
NXii=1,2,,nnn

Xi

M(T)=EetXi=16(et+e2t+e3t+e4t+e5t+e6t)
n
Kn(t)=nlog(16i=16eit)
K

 DD <- function(expr, name, order = 1) {
        if(order < 1) stop("'order' must be >= 1")
        if(order == 1) D(expr, name)
        else DD(D(expr, name), name, order - 1)
     }

make_cumgenfun  <-  function() {
    fun0  <-  function(n, t) n*log(mean(exp((1:6)*t)))
    fun1  <-  function(n, t) {}
    fun2  <-  function(n, t) {}
    fun3  <-  function(n, t) {}
    d1  <-  DD(expression(n*log((1/6)*(exp(t)+exp(2*t)+exp(3*t)+exp(4*t)+exp(5*t)+exp(6*t)))),  "t", 1)
    d2  <-  DD(expression(n*log((1/6)*(exp(t)+exp(2*t)+exp(3*t)+exp(4*t)+exp(5*t)+exp(6*t)))),  "t", 2)
    d3  <-  DD(expression(n*log((1/6)*(exp(t)+exp(2*t)+exp(3*t)+exp(4*t)+exp(5*t)+exp(6*t)))),  "t", 3)
    body(fun1)  <-  d1
    body(fun2)  <-  d2
    body(fun3)  <-  d3
    return(list(fun0,  fun1,  fun2,  fun3))
}

Далее мы должны решить уравнение седловой точки.

Это делается с помощью следующего кода:

funlist  <-  make_cumgenfun()

# To solve the saddlepoint equation for n,  k:
solve_speq  <-   function(n, k)  {# note that n+1 <= k <= 6n is needed
    Kd  <-  function(t) funlist[[2]](n, t)
    k  <-  k-0.5
    uniroot(function(s) Kd(s)-k,  lower=-100,  upper=1,  extendInt="upX")$root
}

k

Функция для возврата хвостовой вероятности:

#

Ghelp  <-  function(n, k) {
    stilde  <-  solve_speq(n, k)
    K  <-  function(t) funlist[[1]](n, t)
    Kd <-  function(t) funlist[[2]](n, t)
    Kdd <- function(t) funlist[[3]](n, t)
    Kddd <- function(t) funlist[[4]](n, t)
    w2tilde  <-  sign(stilde)*sqrt(2*(stilde*(k-0.5)-K(stilde)))  
    u2tilde  <-  2*sinh(stilde/2)*sqrt(Kdd(stilde))
    mu  <-  Kd(0)
    result  <- if (abs(mu-(k-0.5)) <= 0.001) 0.5-Kddd(0)/(6*sqrt(2*pi)*Kdd(0)^(3/2))  else
    1-pnorm(w2tilde)-dnorm(w2tilde)*(1/w2tilde - 1/u2tilde)
    return(result)
}
G  <- function(n, k) {
      fun  <- function(k) Ghelp(n, k)
      Vectorize(fun)(k)
  }

P(Nn)=P(X1+X2++Xnk)=1P(X1++Xnk+1)=1G(n,k+1)
G

K=20n=20

N19

> 1-G(20, 21)
[1] 2.220446e-16

N10

> 1-G(10, 21)
[1] 0.002880649

И так далее. Используя все это, вы можете получить приближение для ожидания самостоятельно. Это должно быть намного лучше, чем приближения, основанные на центральной предельной теореме.

Къетил б Халворсен
источник