Обобщение случая, описанного Дилипом Сарватом
Некоторые из методов, описанных в других ответах, используют схему, в которой вы бросаете последовательность из N монет за ход, и в зависимости от результата вы выбираете число от 1 до 7 или сбрасываете ход и бросаете снова.
Хитрость заключается в том, чтобы найти в расширении возможностей множество из 7 результатов с одинаковой вероятностью пК( 1 - р )н - к и сопоставить их друг с другом.
Поскольку общее число результатов не кратно 7, у нас есть несколько результатов, которые мы не можем присвоить числу, и есть некоторая вероятность того, что нам нужно отбросить результаты и начать все сначала.
Случай использования 7 монет сальто за ход
Интуитивно можно сказать, что бросать кости семь раз было бы очень интересно. Поскольку нам нужно только выбросить 2 из 27 возможностей. А именно, 7 раз головы и 0 раз головы.
Для всех остальных возможностей 27- 2 всегда есть кратные 7 случаев с одинаковым количеством головок. А именно 7 футляров с 1 головкой, 21 футляр с 2 головками, 35 футляров с 3 головками, 35 футляров с 4 головками, 21 футляр с 5 головками и 7 шкафов с 6 головками
Таким образом, если вы вычисляете число (отбрасывая 0 голов и 7 голов), Икс= ∑к = 17( k - 1 ) ⋅ CК
с СК распределенными переменными Бернулли (значение 0 или 1), то X по модулю 7 является равномерной переменной с семью возможными результатами.
Сравнение разного количества подбрасываний монет за ход
Остается вопрос, каким было бы оптимальное количество бросков за ход. Бросание большего количества кубиков за ход обходится вам дороже, но вы уменьшаете вероятность повторного броска.
На рисунке ниже показаны ручные вычисления для первых нескольких монетных бросков за ход. (возможно, может быть аналитическое решение, но я считаю, что можно с уверенностью сказать, что система с 7 подбрасываниями монет обеспечивает лучший метод в отношении ожидаемого значения для необходимого количества подбрасываний монет)
# plot an empty canvas
plot(-100,-100,
xlab="flips per turn",
ylab="E(total flips)",
ylim=c(7,400),xlim=c(0,20),log="y")
title("expectation value for total number of coin flips
(number of turns times flips per turn)")
# loop 1
# different values p from fair to very unfair
# since this is symmetric only from 0 to 0.5 is necessary
# loop 2
# different values for number of flips per turn
# we can only use a multiple of 7 to assign
# so the modulus will have to be discarded
# from this we can calculate the probability that the turn succeeds
# the expected number of flips is
# the flips per turn
# divided by
# the probability for the turn to succeed
for (p in c(0.5,0.2,0.1,0.05)) {
Ecoins <- rep(0,16)
for (dr in (5:20)){
Pdiscards = 0
for (i in c(0:dr)) {
Pdiscards = Pdiscards + p^(i)*(1-p)^(dr-i) * (choose(dr,i) %% 7)
}
Ecoins[dr-4] = dr/(1-Pdiscards)
}
lines(5:20, Ecoins)
points(5:20, Ecoins, pch=21, col="black", bg="white", cex=0.5)
text(5, Ecoins[1], paste0("p = ",p), pos=2)
}
Использование правила ранней остановки
примечание: приведенные ниже расчеты для ожидаемого значения числа бросков для справедливой монеты р = 0,5 , было бы бесполезно делать это при разных значениях п , но принцип остается тем же (хотя и другой учет дела нужны)
Мы должны иметь возможность выбирать случаи (вместо формулы для Икс ) так, чтобы мы могли остановиться раньше.
С 5 монетами мы имеем шесть возможных неупорядоченных наборов голов и хвостов:
1 + 5 + 10 + 10 + 5 + 1 упорядоченных комплектов
И мы можем использовать группы с десятью случаями (то есть группу с двумя головами или группу с двумя хвостами), чтобы выбрать (с равной вероятностью) число. Это происходит в 14 из 2 ^ 5 = 32 случаев. Это оставляет нас с:
1 + 5 + 3 + 3 + 5 + 1 упорядоченных комплектов
С дополнительным (6-м) подбрасыванием монеты мы имеем для семи возможных различных неупорядоченных наборов голов и хвостов:
1 + 6 + 8 + 6 + 8 + 6 + 1 упорядоченных комплектов
И мы можем использовать группы с восемью случаями (то есть группу с 3 головами или группу с 3 хвостами), чтобы выбрать (с равной вероятностью) число. Это происходит в 14 из 2 * (2 ^ 5-14) = 36 случаев. Это оставляет нас с:
1 + 6 + 1 + 6 + 1 + 6 + 1 упорядоченных комплектов
С помощью другого (7-го) дополнительного броска монеты мы имеем для восьми возможных различных неупорядоченных наборов голов и хвостов:
1 + 7 + 7 + 7 + 7 + 7 + 7 + 1 упорядоченных комплектов
И мы можем использовать группы с семью случаями (все, кроме случаев всех хвостов и всех голов), чтобы выбрать (с равной вероятностью) число. Это происходит в 42 из 44 случаев. Это оставляет нас с:
1 + 0 + 0 + 0 + 0 + 0 + 0 + 1 упорядоченных множеств
(мы могли бы продолжить это, но только на 49-м шаге это дает нам преимущество)
Так что вероятность выбора номера
- на 5 сальто это 1432= 716
- на 6 сальто это 9161436= 732
- на 7 сальто это 11324244= 231704
- не в 7 сальто это 1 - 716- 732- 231704= 227
Это делает ожидаемое значение количества сальто за один ход условным, если есть успех и р = 0,5:
5 ⋅ 716+ 6 ⋅ 732+ 7 ⋅ 231704= 5.796875
Значение ожидания для общего количества сальто (до успеха), при условии, что р = 0,5, становится:
( 5 ⋅ 716+ 6 ⋅ 732+ 7 ⋅ 231704) 2727- 2= 539= 5.88889
В ответе NcAdams используется вариант этой стратегии правил остановки (каждый раз, когда появляются два новых броска монет), но он не оптимально выбирает все броски.
Ответ Клайда также может быть аналогичным, хотя может существовать неравномерное правило выбора, согласно которому каждые две подбрасывания монеты может быть выбрано число, но не обязательно с равной вероятностью (расхождение, которое исправляется во время последующих подбрасываний монеты)
Сравнение с другими методами
Другими методами, использующими аналогичный принцип, являются методы, разработанные NcAdams и AdamO.
Принцип таков : решение для числа от 1 до 7 принимается после определенного количества голов и хвостов. После Икс числа сальто для каждого решения, которое приводит к числу я существует аналогичное, в равной степени вероятное, решение, которое приводит к числу J (то же количество голов и хвостов, но только в другом порядке). Некоторые серии голов и хвостов могут привести к решению начать все сначала.
Для методов такого типа метод, размещенный здесь, является наиболее эффективным, поскольку он принимает решения как можно раньше (как только появляется возможность для 7 последовательностей равных вероятностей голов и хвостов после Икс броска мы можем использовать они принимают решение по числу, и нам не нужно переворачивать дальше, если мы сталкиваемся с одним из этих случаев).
Это демонстрируется изображением и моделированием ниже:
#### mathematical part #####
set.seed(1)
#plotting this method
p <- seq(0.001,0.999,0.001)
tot <- (5*7*(p^2*(1-p)^3+p^3*(1-p)^2)+
6*7*(p^2*(1-p)^4+p^4*(1-p)^2)+
7*7*(p^1*(1-p)^6+p^2*(1-p)^5+p^3*(1-p)^4+p^4*(1-p)^3+p^5*(1-p)^2+p^6*(1-p)^1)+
7*1*(0+p^7+(1-p)^7) )/
(1-p^7-(1-p)^7)
plot(p,tot,type="l",log="y",
xlab="p",
ylab="expactation value number of flips"
)
#plotting method by AdamO
tot <- (7*(p^20-20*p^19+189*p^18-1121*p^17+4674*p^16-14536*p^15+34900*p^14-66014*p^13+99426*p^12-119573*p^11+114257*p^10-85514*p^9+48750*p^8-20100*p^7+5400*p^6-720*p^5)+6*
(-7*p^21+140*p^20-1323*p^19+7847*p^18-32718*p^17+101752*p^16-244307*p^15+462196*p^14-696612*p^13+839468*p^12-806260*p^11+610617*p^10-357343*p^9+156100*p^8-47950*p^7+9240*p^6-840*p^5)+5*
(21*p^22-420*p^21+3969*p^20-23541*p^19+98154*p^18-305277*p^17+733257*p^16-1389066*p^15+2100987*p^14-2552529*p^13+2493624*p^12-1952475*p^11+1215900*p^10-594216*p^9+222600*p^8-61068*p^7+11088*p^6-1008*p^5)+4*(-
35*p^23+700*p^22-6615*p^21+39235*p^20-163625*p^19+509425*p^18-1227345*p^17+2341955*p^16-3595725*p^15+4493195*p^14-4609675*p^13+3907820*p^12-2745610*p^11+1592640*p^10-750855*p^9+278250*p^8-76335*p^7+13860*p^6-
1260*p^5)+3*(35*p^24-700*p^23+6615*p^22-39270*p^21+164325*p^20-515935*p^19+1264725*p^18-2490320*p^17+4027555*p^16-5447470*p^15+6245645*p^14-6113275*p^13+5102720*p^12-3597370*p^11+2105880*p^10-999180*p^9+371000
*p^8-101780*p^7+18480*p^6-1680*p^5)+2*(-21*p^25+420*p^24-3990*p^23+24024*p^22-103362*p^21+340221*p^20-896679*p^19+1954827*p^18-3604755*p^17+5695179*p^16-7742301*p^15+9038379*p^14-9009357*p^13+7608720*p^12-
5390385*p^11+3158820*p^10-1498770*p^9+556500*p^8-152670*p^7+27720*p^6-2520*p^5))/(7*p^27-147*p^26+1505*p^25-10073*p^24+49777*p^23-193781*p^22+616532*p^21-1636082*p^20+3660762*p^19-6946380*p^18+11213888*p^17-
15426950*p^16+18087244*p^15-18037012*p^14+15224160*p^13-10781610*p^12+6317640*p^11-2997540*p^10+1113000*p^9-305340*p^8+55440*p^7-5040*p^6)
lines(p,tot,col=2,lty=2)
#plotting method by NcAdam
lines(p,3*8/7/(p*(1-p)),col=3,lty=2)
legend(0.2,500,
c("this method calculation","AdamO","NcAdams","this method simulation"),
lty=c(1,2,2,0),pch=c(NA,NA,NA,1),col=c(1,2,3,1))
##### simulation part ######
#creating decision table
mat<-matrix(as.numeric(intToBits(c(0:(2^5-1)))),2^5,byrow=1)[,c(1:12)]
colnames(mat) <- c("b1","b2","b3","b4","b5","b6","b7","sum5","sum6","sum7","decision","exit")
# first 5 rolls
mat[,8] <- sapply(c(1:2^5), FUN = function(x) {sum(mat[x,1:5])})
mat[which((mat[,8]==2)&(mat[,11]==0))[1:7],12] = rep(5,7) # we can stop for 7 cases with 2 heads
mat[which((mat[,8]==2)&(mat[,11]==0))[1:7],11] = c(1:7)
mat[which((mat[,8]==3)&(mat[,11]==0))[1:7],12] = rep(5,7) # we can stop for 7 cases with 3 heads
mat[which((mat[,8]==3)&(mat[,11]==0))[1:7],11] = c(1:7)
# extra 6th roll
mat <- rbind(mat,mat)
mat[c(33:64),6] <- rep(1,32)
mat[,9] <- sapply(c(1:2^6), FUN = function(x) {sum(mat[x,1:6])})
mat[which((mat[,9]==2)&(mat[,11]==0))[1:7],12] = rep(6,7) # we can stop for 7 cases with 2 heads
mat[which((mat[,9]==2)&(mat[,11]==0))[1:7],11] = c(1:7)
mat[which((mat[,9]==4)&(mat[,11]==0))[1:7],12] = rep(6,7) # we can stop for 7 cases with 4 heads
mat[which((mat[,9]==4)&(mat[,11]==0))[1:7],11] = c(1:7)
# extra 7th roll
mat <- rbind(mat,mat)
mat[c(65:128),7] <- rep(1,64)
mat[,10] <- sapply(c(1:2^7), FUN = function(x) {sum(mat[x,1:7])})
for (i in 1:6) {
mat[which((mat[,10]==i)&(mat[,11]==0))[1:7],12] = rep(7,7) # we can stop for 7 cases with i heads
mat[which((mat[,10]==i)&(mat[,11]==0))[1:7],11] = c(1:7)
}
mat[1,12] = 7 # when we did not have succes we still need to count the 7 coin tosses
mat[2^7,12] = 7
draws = rep(0,100)
num = rep(0,100)
# plotting simulation
for (p in seq(0.05,0.95,0.05)) {
n <- rep(0,1000)
for (i in 1:1000) {
coinflips <- rbinom(7,1,p) # draw seven numbers
I <- mat[,1:7]-matrix(rep(coinflips,2^7),2^7,byrow=1) == rep(0,7) # compare with the table
Imatch = I[,1]*I[,2]*I[,3]*I[,4]*I[,5]*I[,6]*I[,7] # compare with the table
draws[i] <- mat[which(Imatch==1),11] # result which number
num[i] <- mat[which(Imatch==1),12] # result how long it took
}
Nturn <- mean(num) #how many flips we made
Sturn <- (1000-sum(draws==0))/1000 #how many numbers we got (relatively)
points(p,Nturn/Sturn)
}
другое изображение, масштабируемое на p ∗ ( 1 - p ) для лучшего сравнения:
увеличить сравнение методов, описанных в этом посте и комментариях
«условный пропуск 7-го шага» - это небольшое улучшение, которое может быть сделано по правилу ранней остановки. В этом случае вы выбираете не группы с равными вероятностями после 6-го броска. У вас есть 6 групп с равной вероятностью и 1 группа с немного другой вероятностью (для этой последней группы вам нужно перевернуть еще один дополнительный раз, когда у вас есть 6 голов или хвостов и поскольку вы сбрасываете 7 голов или 7 хвостов, вы закончите с той же вероятностью в конце концов)
Автор StackExchangeStrike