Мозговой тизер: Как сгенерировать 7 целых чисел с равной вероятностью, используя смещенную монету, у которой pr (голова) = p?


58

Это вопрос, который я нашел на Glassdoor : как можно сгенерировать 7 целых чисел с равной вероятностью, используя монету с Pr(Head)=p(0,1) ?

По сути, у вас есть монета, которая может быть или не быть честной, и это единственный процесс генерации случайных чисел, который у вас есть, поэтому придумайте генератор случайных чисел, который выводит целые числа от 1 до 7, где вероятность получения каждого из этих целых чисел 1/7.

Эффективность данных генерирует процесс имеет значение.



12
Есть множество способов сделать это. Более интересная версия вопроса требует лучшего метода в определенном смысле. Естественным ощущением лучшего будет наименьшее ожидаемое количество сальто на сгенерированное целое число. Другая интересная версия - это описание всех возможных решений (которые зависят от независимых бросков монеты и ничего более).
whuber

1
@whuber хорошее предложение, я отредактировал вопрос, чтобы отразить ваш комментарий.
амазонка

<<< По сути, у вас есть монета, которая может быть или не быть честной, и это единственный процесс генерации случайных чисел, который у вас есть >>> Означает ли это, что использование монеты любым другим способом, чем подбрасывание и проверка на голову против хвоста "запрещено", так как это будет другой процесс генерации случайных чисел?
TinglTanglBob

9
Мод 7 года на монете.
Nat

Ответы:


56

Переверните монету дважды. Если он приземлится HHилиTT проигнорирует его, дважды переверните его.

Теперь монета имеет равную вероятность подняться HTили TH. Если это произойдет HT, позвоните H1. Если это произойдет TH, позвоните T1.

Продолжайте получать H1или T1пока у вас не будет три подряд. Эти три результата дают вам число, основанное на таблице ниже:

H1 H1 H1 -> 1
H1 H1 T1 -> 2
H1 T1 H1 -> 3
H1 T1 T1 -> 4
T1 H1 H1 -> 5
T1 H1 T1 -> 6
T1 T1 H1 -> 7
T1 T1 T1 -> [Throw out all results so far and repeat]

Я утверждаю, что это будет прекрасно работать, хотя в этом процессе у вас будет много потерянных бросков!


4
Единственное ограничение заключается в том, что вероятность головок равна «р». Обратите внимание, что p может быть или 1 . Так что это не гарантировано, но Sycorax (или Sephan) будет работать, даже в этих случаях. 01
gung - Восстановить Монику

8
@ Gung: Я не уверен, что работал бы за монету с двумя головами или двумя хвостами.
С. Коласса - Восстановить Монику

6
С вероятностью он закончится за конечное время. 1
Кларк

18
Это называется отбеливанием по фон Нейману.
ДонФусили

4
Вы можете перебрать экстрактор фон Неймана, чтобы более полно извлечь энтропию из последовательности. Соберите все пары HH и TT, примите во внимание последовательность, примените к ней экстрактор фон Неймана и т. Д.
A Simmons

47

Предположим, что .p(0,1)

Шаг 1: . Бросьте монету 5 раз.

Если результат

, верните 1 и остановитесь.(H,H,H,T,T)1

, верните 2 и остановитесь.(H,H,T,T,H)2

, верните 3 и остановитесь.(H,T,T,H,H)3

, верните 4 и остановитесь.(T,T,H,H,H)4

, верните 5 и остановитесь.(T,H,H,H,T)5

, верните 6 и остановитесь.(H,H,T,H,T)6

, верните 7 и остановитесь.(ЧАС,T,ЧАС,T,ЧАС)7

Шаг 2: . Если результат не один из вышеперечисленных, повторите шаг 1.

Обратите внимание, что независимо от значения , каждый из семи перечисленных выше результатов имеет вероятность q = p 3 ( 1 - p ) 2 , и ожидаемое количество бросков монет равно 5п(0,1)Qзнак равноп3(1-п)2 . Тоссеру не нужно знать значениеp(за исключением того, чтоp0иp1); гарантируется, что семь целых чисел с равной вероятностью будут возвращены экспериментом после его завершения (и гарантированно закончится с вероятностью1).57Qпп0п11


6
Можем ли мы уменьшить ожидаемое количество бросков для этого, разрешив либо последовательность, указанную здесь, ИЛИ эту последовательность с каждым инвертированным сальто. Например: для 1, (H, H, H, T, T) или (T, T, T, H, H)?
больше на

5
Вы также можете добавить дополнение. Если результат равен (H, H, H, T, T) или (T, T, T, H, H), верните 1 и остановите и т. Д. В этом случае вероятность каждого результата равна . Qзнак равноп3(1-п)2+п2(1-п)3
Секст Эмпирик,

2
Разве не было бы возможно просто добавить еще один бросок монеты, если результат не соответствует какой-либо (H, H, H, T, T) договоренности? С дополнительным броском монеты вам понадобится еще одно отображение (H, H, H, T, T, T) и (H, H, T, T, T, T) и каждой комбинации xT (7-x) H которые могут быть расположены в 7 или более различных порядках к номерам от 1 до 7. Вместо повторного бросания всех 5 монет это добавит только 1 дополнительный бросок, но я не уверен, что это
сработает

5
Возможно, лучше всего было бы мгновенно перевернуть монету 7 раз, поскольку, как это гарантировано, вы получите случайное число из нее (поэтому единственное исключение состоит в том, что монета приземляется вверх или в хвост все 7 попыток) , Таким образом, с 7 бросками вы можете получить от 1 до 6 голов (я исключаю опции 0 и 7 здесь, поскольку они бессмысленны). Если на одной голове возможны 7 различных вариантов расположения (H, T, T, T, T, T, T); Если 2 головы его 21; если 3 головы его 35; если 4 35 голов; если 5 21 головы; если 6 7 голов; Каждый может быть идеально сопоставлен с номером 1-7 без потери комбинации.
TinglTanglBob

2
@TinglTanglBob Это, по сути, ответ Martijn Weterings ;-)
M.Herzkamp

22

Обобщение случая, описанного Дилипом Сарватом

Некоторые из методов, описанных в других ответах, используют схему, в которой вы бросаете последовательность из N монет за ход, и в зависимости от результата вы выбираете число от 1 до 7 или сбрасываете ход и бросаете снова.

Хитрость заключается в том, чтобы найти в расширении возможностей множество из 7 результатов с одинаковой вероятностью пК(1-п)N-К и сопоставить их друг с другом.

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


Случай использования 7 монет сальто за ход

Интуитивно можно сказать, что бросать кости семь раз было бы очень интересно. Поскольку нам нужно только выбросить 2 из 27 возможностей. А именно, 7 раз головы и 0 раз головы.

Для всех остальных возможностей 27-2 всегда есть кратные 7 случаев с одинаковым количеством головок. А именно 7 футляров с 1 головкой, 21 футляр с 2 головками, 35 футляров с 3 головками, 35 футляров с 4 головками, 21 футляр с 5 головками и 7 шкафов с 6 головками

Таким образом, если вы вычисляете число (отбрасывая 0 голов и 7 голов),

Иксзнак равноΣКзнак равно17(К-1)СК

с СК распределенными переменными Бернулли (значение 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:

5716+6732+7231704знак равно5.796875

Значение ожидания для общего количества сальто (до успеха), при условии, что р = 0,5, становится:

(5716+6732+7231704)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)
}

другое изображение, масштабируемое на п*(1-п) для лучшего сравнения:

сравнение с масштабированными значениями ожидания

увеличить сравнение методов, описанных в этом посте и комментариях

методы сравнения, описанные здесь

«условный пропуск 7-го шага» - это небольшое улучшение, которое может быть сделано по правилу ранней остановки. В этом случае вы выбираете не группы с равными вероятностями после 6-го броска. У вас есть 6 групп с равной вероятностью и 1 группа с немного другой вероятностью (для этой последней группы вам нужно перевернуть еще один дополнительный раз, когда у вас есть 6 голов или хвостов и поскольку вы сбрасываете 7 голов или 7 хвостов, вы закончите с той же вероятностью в конце концов)


Автор StackExchangeStrike


Я только начинал делать вычисления для случая n = 7, потому что у меня было ощущение, что это может быть лучше, чем n = 1. Слушай, сэр!
М.Херцкамп,

@ M.Herzkamp небольшое улучшение еще возможно. Одно число (один бросок монеты) не требуется для вычисления X , поскольку оно имеет коэффициент 0. Это число необходимо только для определения случая всех голов или всех хвостов, и его можно опустить, когда мы уже знаем, что у нас смешанный случай. СКИкс
Секст Эмпирик

Таким образом, улучшение приводит к тому, что количество ожидаемых подбрасываний монет составляет чуть более 6 монет. Это будет варьироваться, чтобы доказать, что это оптимальное решение. Схема, созданная Clid, немного расходится, позволяя выбирать число при определенном количестве монетных бросков, но не с равной вероятностью (по крайней мере, не для этого конкретного шага, это будет исправлено позже).
Секст Эмпирик

Но если вы решаете, подбрасывать ли шестую монету на основе первых пяти результатов, обусловлены ли вероятности каждого сета до шести сальто так же, как и для других сетов?
накопление

@ Накопление, вы можете нарисовать его в виде бинарного дерева с 7 уровнями. Мы будем выбирать только среди узлов, если есть 7 с равной вероятностью. Это похоже на ранение некоторых веток ранее (на уровне 5 или 6). Если хотите, вы можете продолжить до 7 шагов, а не раньше, но для этих конкретных случаев бросок 6-й и 7-й монет не имеет значения.
Секст Эмпирик

20

Разделите прямоугольник на семь областей равных областей, каждая из которых помечена целым числом. Бросьте монету в коробку таким образом, чтобы она имела равную вероятность посадки в каждом регионе.

π с использованием физической процедуры Монте-Карло, например, бросания рисовых зерен на бумагу с нарисованным на ней кругом.

пзнак равно1пзнак равно0


2
Можете ли вы предложить способ разделить коробку на семь областей равной площади, чтобы минимизировать смещение от переворачивания, отскока от стен и т. Д.? Семь секторов под углом 360/7?
августа

1
@smci Вот почему я оговариваю, что вы должны бросить монету, чтобы была одинаковая вероятность ее посадки в каждом квадрате. Если отскакивание от стены влияет на эту вероятность, то вы должны учитывать это в своем броске.
Восстановите Монику

17
Да, я знаю это, и я указываю вам, что просто сказать «бросить это непредвзято», не определяя точно, как этого добиться, на самом деле не полный ответ ... в этом случае flipping-H / T основанные методы превосходят.
smci

1
«Равные области с бросками, которые имеют равную вероятность приземления в каждом регионе», может быть трудно установить на практике. На практике может быть легче выделить большое количество «тренировочных заездов», а затем эмпирически поделить площадку посадки на равновероятные пространства (например, с 700 бросками, исключить линию, отсекающую самые дальние 100 бросков, затем другую для следующей 100 и тд). Упрощение этого для генерации одного случайного бита состояло бы в том, чтобы бросить монету дважды - если первый бросок идет дальше, это бит 0, а если второй бросок идет дальше, то это1
Silverfish

4
Есть хороший ответ от @TheScienceBoy, который, к сожалению, удаляется с интересной альтернативой этому - эффективно, используя монету в качестве прядильщика и отмечая 7 секций вдоль ее окружности - который сохраняет большую часть духа этого ответа, но может быть более физически простым выполнять!
Серебряная рыбка

8

РЕДАКТИРОВАТЬ: на основе отзывов других.

Вот интересная мысль:

установить список {1,2,3,4,5,6,7}. Бросайте монеты для каждого элемента в списке последовательно. Если он попадает головой вверх для определенного элемента, уберите номер из списка. Если все числа из определенной итерации списка удалены, повторите выборку. Делайте так, пока не останется только один номер.

drop.one <- function(x, p) {
  drop <- runif(length(x)) < p
  if (all(drop))
    return(x)
  return(x[!drop])
}

sample.recur <- function(x, p) {
  if (length(x) > 1)
    return(sample.recur(drop.one(x, p), p))
  return(x)
}

# x <- c(1:7,7:1)
x <- 1:7
p <- 0.01

out <- replicate(1e5, sample.recur(x, p))

round(prop.table(table(out)), 2)

дает мне примерно равномерное распределение

> round(prop.table(table(out)), 2)
out
   1    2    3    4    5    6    7 
0.14 0.14 0.15 0.14 0.14 0.14 0.14 

N


Оценка ожидаемого значения количества бросков монет

ИксY

Mзнак равно[Q700000117п1Q6Q600000021п2Q56п1Q5Q50000035п3Q415п2Q45Q4Q4000035п4Q320п3Q310п2Q34п1Q3Q300021п5Q215п4Q210п3Q26п2Q23п1Q2Q2007п6Q16п5Q15п4Q14п3Q13п2Q12п1Q100п7п6п5п4п3п200]

(M-я)vзнак равно0 ), показывает, сколько времени относительно тратится в каком состоянии. Тогда 7-е состояние - это то, как часто вы сможете нарисовать число от 1 до 7. В других состояниях указано, сколько монет стоит сальто.

Е(N)знак равно247п(1-п)

сравнение ожидаемого значения для подбрасывания монет

п>2/3 . Но также производительность несимметрична. Симметричная и лучшая общая производительность может быть достигнута, когда будет создано вероятностное правило переключения, которое меняет правило принятия решений с хвостов на головы, когда головы оказываются маловероятными.

Решение найдено с помощью wxMaxima

M: matrix(
 [(1-p)^7,        0,          0,0,0,0,1,1], 
 [7* p*(1-p)^6,   (1-p)^6,        0,0,0,0,0,0], 
 [21*p^2*(1-p)^5, 6*p*(1-p)^5,    (1-p)^5,0,0,0,0,0], 
 [35*p^3*(1-p)^4, 15*p^2*(1-p)^4, 5*p*(1-p)^4,(1-p)^4,0,0,0,0], 
 [35*p^4*(1-p)^3, 20*p^3*(1-p)^3, 10*p^2*(1-p)^3,4*p*(1-p)^3,(1-p)^3,0,0,0], 
 [21*p^5*(1-p)^2, 15*p^4*(1-p)^2, 10*p^3*(1-p)^2,6*p^2*(1-p)^2,3*p*(1-p)^2,(1-p)^2,0,0], 
 [7* p^6*(1-p)^1, 6*p^5*(1-p),    5*p^4*(1-p),4*p^3*(1-p),3*p^2*(1-p),2*(1-p)*p,0,0], 
 [p^7,        p^6,        p^5,p^4,p^3,p^2,0,0]
);
z: nullspace(M-diagmatrix(8,1));
x : apply (addcol, args (z));
t : [7,6,5,4,3,2,0,0];
plot2d(t.x/x[7],[p,0,1],logy);

Расчеты в R

# plotting empty canvas
plot(-100,-100,
     xlab="p",
     ylab="E(total flips)",
     ylim=c(10,1000),xlim=c(0,1),log="y")

# plotting simulation
for (p in seq(0.1,0.9,0.05)) {

  n <- rep(0,10000)
  for (i in 1:10000) {
    success  = 0
    tests = c(1,1,1,1,1,1,1)     # start with seven numbers in the set
    count = 0
    while(success==0) {
      for (j in 1:7)  {
        if (tests[j]==1) {
          count = count + 1
          if  (rbinom(1,1,p) == 1) {
            tests[j] <- 0        # elliminate number when we draw heads
          }
        }
      }
      if (sum(tests)==1) {
        n[i] = count
        success = 1              # end     when 1 is left over
      }
      if (sum(tests)==0) {
        tests = c(1,1,1,1,1,1,1) # restart when 0 are left over
      }
    }
  }
  points(p,mean(n))
}

# plotting formula
p <- seq(0.001,0.999,0.001)

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)

#plotting comparison with alternative method
lines(p,3*8/7/(p*(1-p)),lty=2)

legend(0.2,500,
       c("simulation","calculation","comparison"),
       lty=c(0,1,2),pch=c(1,NA,NA))

1
Умная идея (+1). Интуитивно понятно, что это должно работать, поскольку симметрия, как представляется, сводит на нет смещение в сторону какого-либо конкретного числа. Тем не менее, я хотел бы увидеть доказательства.
Восстановить Монику

6
Эта идея действительно хороша, но с высокой вероятностью для головы (выбейте это число), я думаю, у последнего числа в строке есть лучшие шансы «выжить», так как все остальные, находящиеся в первых рядах, вылетят с большой вероятностью раньше в первом заезде? Может быть, это можно изменить, не бросая монету последовательно, а параллельно для всех чисел в х? Время выполнения сценария может увеличиться, я думаю :)
TinglTanglBob

2
Я согласен с @TinglTanglBob - когда я устанавливаю, p <- 0.99я получаю вывод0.89 0.02 0.02 0.02 0.02 0.02 0.02
Silverfish

6
Разве выполнение исключения в «раундах» не решит проблему смещения? Начните с 7 номеров. Бросьте монету за каждое оставшееся число и уберите тех, кто бросает голову. Если все оставшиеся числа будут удалены в раунде, поцарапайте результаты этого раунда и попробуйте снова. Я не знаю, как это доказать, но интуитивно порядок номеров больше не имеет значения, являются ли они «победителями»
Фил,

1
пзнак равно0,01

5

Вопрос немного двусмысленный, задается ли вопрос «сгенерировать случайное целое число, равное или меньшее 7 с равной вероятностью», или он задает «сгенерировать 7 случайных целых чисел с равной вероятностью?» - а что такое пространство целых чисел?!?

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

С пристрастной монетой вы можете произвести честную монету, выполнив следующую процедуру: https://en.wikipedia.org/wiki/Fair_coin#Fair_results_from_a_biased_coin

Число 7 или меньше может быть записано в двоичном виде как три {0,1} цифры. Таким образом, все, что нужно сделать, это выполнить вышеописанную процедуру три раза и преобразовать двоичное число, полученное обратно, в десятичное.


1
сравнивая мой ответ с @NcAdams, ясно, что я включаю 0 в качестве возможного желаемого результата!
Cam.Davidson.Pilon

Я не понимаю, как ваш ответ отличается. Если вы включите {0,0,0} -> 1, то что отображает {1,1,1}? Есть 8 возможностей.
AdamO

1
000 соответствует 0, поэтому мой комментарий о включении 0 в качестве возможного значения. Это было опубликовано до редактирования OP и почти одновременно как NcAdams.
Cam.Davidson.Pilon

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

3

Решение, которое никогда не тратит впустую сальто, которое очень помогает для очень предвзятых монет.

Недостаток этого алгоритма (как написано, по крайней мере) состоит в том, что он использует арифметику произвольной точности. Практически вы, вероятно, захотите использовать это до целочисленного переполнения, и только потом выбросить и начать все сначала.

Кроме того , вы должны знать , что смещение есть ... что вы не могли бы, скажем, если она зависит от температуры , как и большинство физических явлений.


Предположим, что вероятность появления головы составляет, скажем, 30%.

  • Начните с диапазона [1, 8).
  • Переверни свою монету. Если головы, используйте левые 30%, так что ваш новый диапазон [1, 3.1). Иначе, используйте правильные 70%, так что ваш новый диапазон [3.1, 8).
  • Повторяйте, пока весь диапазон не будет иметь одинаковую целочисленную часть.

Полный код:

#!/usr/bin/env python3
from fractions import Fraction
from collections import Counter
from random import randrange


BIAS = Fraction(3, 10)
STAT_COUNT = 100000


calls = 0
def biased_rand():
    global calls
    calls += 1
    return randrange(BIAS.denominator) < BIAS.numerator


def can_generate_multiple(start, stop):
    if stop.denominator == 1:
        # half-open range
        stop = stop.numerator - 1
    else:
        stop = int(stop)
    start = int(start)
    return start != stop


def unbiased_rand(start, stop):
    if start < 0:
        # negative numbers round wrong
        return start + unbiased_rand(0, stop - start)
    assert isinstance(start, int) and start >= 0
    assert isinstance(stop, int) and stop >= start
    start = Fraction(start)
    stop = Fraction(stop)
    while can_generate_multiple(start, stop):
        if biased_rand():
            old_diff = stop - start
            diff = old_diff * BIAS
            stop = start + diff
        else:
            old_diff = stop - start
            diff = old_diff * (1 - BIAS)
            start = stop - diff
    return int(start)


def stats(f, *args, **kwargs):
    c = Counter()
    for _ in range(STAT_COUNT):
        c[f(*args, **kwargs)] += 1

    print('stats for %s:' % f.__qualname__)
    for k, v in sorted(c.items()):
        percent = v * 100 / STAT_COUNT
        print('  %s: %f%%' % (k, percent))


def main():
    #stats(biased_rand)
    stats(unbiased_rand, 1, 7+1)
    print('used %f calls at bias %s' % (calls/STAT_COUNT, BIAS))


if __name__ == '__main__':
    main()

3
[0,1]0000...6666...К

То же самое для одного выхода, верно? Просто лучше для нескольких? Я бы написал так, как diff *= 7я думаю ... на самом деле, нет особой необходимости использовать одну и ту же базу для каждой попытки.
o11c

Да, то же самое, если вы хотите один выход; это только повышает эффективность, если вы хотите несколько.
Федерико Полони

пп

Это абсолютно бесполезно, если вы хотите один выход. Для честной монеты стандартная техника (бросьте монету три раза и повторите, если вы получите ТТТ) дает ожидаемое количество 24/7 = 3 + 3/7 бросков. Если вы используете эту технику в стиле арифметического кодирования, вы будете бросать по крайней мере четыре раза, если не получите HHH или TTT, что дает вам ожидаемое количество более 15/4 = 3 + 3/4 броска.
Питер Шор

3

Как упоминалось в предыдущих комментариях, эта головоломка относится к статье Джона фон Неймана 1951 года «Различные методы, используемые в связи со случайными цифрами», опубликованной в исследовательском журнале Национального бюро стандартов:

введите описание изображения здесь

пе(п)е е(п)знак равномин{1,2п}N испытаний.


2

п1п0

Сначала мы превращаем (возможно) нечестную монету в честную, используя процесс из ответа NcAdams :

Переверните монету дважды. Если он приземлится HHилиTT проигнорирует его, дважды переверните его.

Теперь монета имеет равную вероятность подняться HTили TH. Если это произойдет HT, позвоните H1. Если это произойдет TH, позвоните T1.

01H1знак равно1T1 знак равно00.H1 H1 T10,110

1/7

1/7знак равно0,001001001,,,

2/7знак равно0,010010010,,,

3/7знак равно0,011011011,,,

4/7знак равно0,100100100,,,

5/7знак равно0,101101101,,,

6/7знак равно0,110110110,,,

NN/7(N-1)/717


1
1/7

1
1/7ΣКзнак равно1(1/8)Кзнак равно17

1
NT(N)знак равно2N-62NN3
3+ΣNзнак равно31-T(N)знак равно4.5
87*33,42

2

Вдохновленный ответом AdamO, вот решение Python, которое позволяет избежать смещения:

def roll(p, n):
    remaining = range(1,n+1)
    flips = 0
    while len(remaining) > 1:
        round_winners = [c for c in remaining if random.choices(['H','T'], [p, 1.0-p]) == ['H']]
        flips += len(remaining)
        if len(round_winners) > 0:
            remaining = round_winners
        p = 1.0 - p
    return remaining[0], flips

Здесь есть два основных изменения: Основное состоит в том, что если все числа сбрасываются за раунд, повторите раунд. Кроме того, я переключаю выбор того, означает ли голова или хвост, отбрасывать каждый раз. Это уменьшает количество бросков, необходимых в случаях, когда p близко к 0 или 1, на ~ 70%, когда p = 0,999


2
«Я выбираю, выбрасывать ли головы или хвосты каждый раз, выбрасывая. Это уменьшает количество бросков, необходимых в случаях, когда p близко к 0 или 1, на ~ 70%, когда p = 0,999» - умное мышление!
Серебряная рыба

1
Чередование голов или хвостов определенно является улучшением по сравнению с постоянным сбросом головок, но, возможно, было бы лучше, если бы после подбрасывания монеты для каждого оставшегося варианта, если они все были одинаковыми, мы повторяли бы все их, в противном случае, если есть по крайней мере столько голов, сколько хвостов, мы исключаем оставшиеся варианты, соответствующие головам, в противном случае мы исключаем оставшиеся варианты, соответствующие хвостам.
Дэвид Кэри

2

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

ЧАС1
ЧАС2

ЧАС7
ЧАС1

и т.д

T


AпT

пAп(целые числа не генерируются)знак равно(1-п)7

Nб

подсчитыватьAп(бесполезные сальто)7Nб(1-п)7

В(п,Nзнак равно5)п3(1-п)2

пDS(целые числа не генерируются)знак равно1-7п3(1-п)2

Количество бесполезных сальто здесь будет стремиться к

подсчитыватьDS(бесполезные сальто)5Nб[1-7п3(1-п)2]

Aп

подсчитыватьAп(бесполезные сальто)<подсчитыватьDS(бесполезные сальто)

7Nб(1-п)7<5Nб[1-7п3(1-п)2]

7(1-п)7<5[1-7п3(1-п)2]

п>0,0467Aп

пAпDSп0,5967

подсчитыватьAп(бесполезные сальто)подсчитыватьDS(бесполезные сальто)

0,67пзнак равно0,10,3пзнак равно0.20,127пзнак равно0,4


п(0,1)

1
@Sycorax Я добавил кое-что, хотя я не уверен, что это так, как вы предлагали.
Алекос Пападопулос

ЧАС

1
12345679999999 .
Секст Эмпирик

1
п . Для любого значенияpсобытие, в котором второе значение равно 2, не будет зависеть от события, в котором первое значение равно 1. Последовательность, имеющая в среднем одинаковое число каждого значения, является гораздо более слабым условием, что Iid Униформа. Например, последовательность, в которой я выбираю число честно и повторяю его миллион раз, удовлетворяет первому условию (и гораздо более «эффективна», чем этот ответ). 17п
JWG
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.