Generalizzando il caso descritto da Dilip Sarwate
Alcuni dei metodi descritti nelle altre risposte utilizzano uno schema in cui si lancia una sequenza di n monete in un "turno" e, in base al risultato, si sceglie un numero compreso tra 1 o 7 oppure si scartano i turni e si lancia di nuovo.
Il trucco è trovare nell'espansione delle possibilità un multiplo di 7 risultati con la stessa probabilità pk(1−p)n−k e abbinarli tra loro.
Poiché il numero totale di risultati non è un multiplo di 7, abbiamo alcuni risultati che non possiamo assegnare a un numero e abbiamo alcune probabilità che dobbiamo scartarli e ricominciare da capo.
Il caso dell'utilizzo di 7 lanci di monete per turno
Intuitivamente potremmo dire che lanciare i dadi sette volte sarebbe molto interessante. Dal momento che abbiamo solo bisogno di buttare via 2 delle 27 possibilità. Vale a dire, il 7 volte teste e 0 volte teste.
Per tutte le altre 27−2 possibilità c'è sempre un multiplo di 7 casi con lo stesso numero di teste. Vale a dire 7 casi con 1 testa, 21 casi con 2 teste, 35 casi con 3 teste, 35 casi con 4 teste, 21 casi con 5 teste e 7 casi con 6 teste.
Quindi se calcoli il numero (scartando 0 teste e 7 teste) X=∑k=17(k−1)⋅Ck
con Ck variabili variabili distribuite da Bernoulli (valore 0 o 1), quindi X modulo 7 è una variabile uniforme con sette possibili risultati.
Confronto tra un numero diverso di lanci di monete per turno
La domanda rimane quale sarebbe il numero ottimale di tiri per turno. Tirare più dadi per turno ti costa di più, ma riduci la probabilità di dover rotolare di nuovo.
L'immagine seguente mostra un calcolo manuale per i primi numeri di lanci di monete per turno. (forse potrebbe esserci una soluzione analitica, ma credo sia sicuro affermare che un sistema con 7 lanci di monete fornisce il metodo migliore per quanto riguarda il valore di aspettativa per il numero necessario di lanci di monete)
# 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)
}
Utilizzando una regola di arresto anticipato
p=0.5p
X
Con 5 lanci di monete abbiamo per le sei possibili diverse serie non ordinate di teste e code:
1 + 5 + 10 + 10 + 5 + 1 set ordinati
E possiamo usare i gruppi con dieci casi (cioè il gruppo con 2 teste o il gruppo con 2 code) per scegliere (con uguale probabilità) un numero. Ciò si verifica in 14 casi su 2 ^ 5 = 32. Questo ci lascia con:
1 + 5 + 3 + 3 + 5 + 1 set ordinati
Con un lancio di monete extra (6 °) abbiamo per le sette possibili diverse serie non ordinate di teste e code:
1 + 6 + 8 + 6 + 8 + 6 + 1 set ordinati
E possiamo usare i gruppi con otto casi (ovvero il gruppo con 3 teste o il gruppo con 3 code) per scegliere (con uguale probabilità) un numero. Ciò si verifica in 14 casi su 2 * (2 ^ 5-14) = 36 casi. Questo ci lascia con:
1 + 6 + 1 + 6 + 1 + 6 + 1 set ordinati
Con un altro (7 °) lancio di monete extra abbiamo per le otto possibili diverse serie non ordinate di teste e code:
1 + 7 + 7 + 7 + 7 + 7 + 7 + 1 set ordinati
E possiamo usare i gruppi con sette casi (tutti tranne tutti i casi e tutti i capi) per scegliere (con uguale probabilità) un numero. Ciò si verifica in 42 casi su 44. Questo ci lascia con:
1 + 0 + 0 + 0 + 0 + 0 + 0 + 1 set ordinati
(potremmo continuare questo, ma solo nel 49 ° passaggio questo ci dà un vantaggio)
Quindi la probabilità di selezionare un numero
- 1432=716
- 9161436=732
- 11324244=231704
- 1−716−732−231704=227
Questo rende il valore di aspettativa per il numero di lanci in un turno, a condizione che ci sia successo e p = 0,5:
5⋅716+6⋅732+7⋅231704=5.796875
Il valore di aspettativa per il numero totale di lanci (fino a quando non c'è un successo), a condizione che p = 0,5, diventi:
(5⋅716+6⋅732+7⋅231704)2727−2=539=5.88889
La risposta di NcAdams utilizza una variante di questa strategia delle regole di arresto (ogni volta escono due nuovi lanci di monete) ma non sta selezionando in modo ottimale tutti i lanci.
Anche la risposta di Clid potrebbe essere simile anche se potrebbe esserci una regola di selezione irregolare secondo cui ogni due gettoni lancia un numero, ma non necessariamente con uguale probabilità (una discrepanza che viene riparata durante i gettoni successivi)
Confronto con altri metodi
Altri metodi che usano un principio simile sono quelli di NcAdams e AdamO.
xij
x
Ciò è dimostrato dall'immagine e dalla simulazione seguenti:
#### 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)
ingrandire i metodi di confronto descritti in questo post e commenti
il "salto condizionato del 7 ° passaggio" è un leggero miglioramento che può essere apportato alla regola di arresto anticipato. In questo caso non si selezionano gruppi con pari probabilità dopo il 6 ° lancio. Hai 6 gruppi con pari probabilità e 1 gruppo con una probabilità leggermente diversa (per quest'ultimo gruppo devi capovolgere un altro tempo in più quando hai 6 teste o code e poiché scarti le 7 teste o 7 code, finirai dopo con la stessa probabilità dopo tutto)
Scritto da StackExchangeStrike