Мозок тизера: Як генерувати 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". Зауважте, що р може бути або . Таким чином, це не гарантовано спрацює, але Sycorax (або Сефан) буде працювати, навіть у тих випадках. 101
gung - Відновіть Моніку

8
@gung: Я не впевнений, що працював би за монету з двома головами або двома хвостами.
С. Коласа - Відновіть Моніку

6
З вірогідністю він закінчиться в кінцевий час. 1
кларк

18
Це називається відбілюванням Фон-Неймана.
DonFusili

4
Ви можете повторити витяжку фон Неймана для більш повного вилучення ентропії з послідовності. Зберіть всі пари HH та TT, вважайте, що послідовність, застосуйте до цього витяжку фон Неймана тощо.
Сіммонс

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 та зупинитися.(H,T,H,T,H)7

Крок 2: . Якщо результат не є жодним із зазначених, повторіть крок 1.

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


6
Чи можемо ми зменшити очікувану кількість закидів для цього, дозволяючи або послідовність, зазначену тут, або цю послідовність з кожним перевернутим фліпом. наприклад: Для 1, або (H, H, H, T, T) або (T, T, T, H, H)?
більшеON

5
Ви також можете додати доповнення. Якщо результат (H, H, H, T, T) або (T, T, T, H, H), поверніть 1 і зупиніться і т. Д. У цьому випадку ймовірність кожного результату дорівнює . q=p3(1p)2+p2(1p)3
Секст Емпірік

2
Чи не вдалося б просто додати ще одне перевертання монети, якщо результат не матиме жодної (H, H, H, T, T) домовленості? За допомогою додаткового кидання монети вам знадобиться ще одне відображення (H, H, H, T, T, T) і (H, H, T, T, T) і кожної комбінації xT (7-x) H що може бути впорядковано в 7 або більше різних замовлень на цифри від 1 до 7. Замість переоформлення всіх 5 монет це додало б лише 1 додатковий жеребкування, але я не впевнений, чи працює: D
TinglTanglBob

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 Це, по суті, відповідь
Мартійна Ветеринга

22

Узагальнення випадку, описаного Діліпом Сарвате

Деякі з методів, описаних в інших відповідях, використовують схему, в якій ви кидаєте послідовність з n монет "поворотом", і залежно від результату ви вибираєте число від 1 до 7 або відкидаєте виток і кидаєте знову.

Трюк полягає в тому, щоб знайти в розширенні можливостей кратне 7 результатів з однаковою ймовірністю pk(1p)nk і співставити ті, що стоять один проти одного.

Оскільки загальна кількість результатів не кратна 7, у нас є кілька результатів, які ми не можемо віднести до числа, і є певна ймовірність того, що нам потрібно відкинути результати та почати спочатку.


Випадок використання 7 монетних оборотів за оборот

Інтуїтивно можна сказати, що катати кістки сім разів було б дуже цікаво. Оскільки нам потрібно лише викинути 2 з 27 можливостей. А саме 7 разів голови та 0 разів голови.

Для всіх інших 272 можливостей завжди існує кілька з 7 випадків з однаковою кількістю головок. А саме 7 справ з 1 головою, 21 справа з 2 головами, 35 справ з 3 головами, 35 справ з 4 головами, 21 справа з 5 головами і 7 справ з 6 головами.

Отже, якщо обчислити число (відкинувши 0 голів і 7 голів)

X=k=17(k1)Ck

з розподіленими змінними Ck Бернуллі (значення 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)
}

Використання правила раннього припинення

зауважте: наведені нижче обчислення для значення очікування кількості фліп - для справедливої ​​монети p=0.5 , це стане безладним для різних p , але принцип залишається тим самим (хоча різний облік бухгалтерського обліку справи потрібні)

Ми повинні мати можливість вибирати випадки (замість формули для X ), щоб ми могли зупинитися раніше.

  • З 5 монетних обертів ми маємо для шести можливих різних не упорядкованих наборів голів та хвостів:

    1 + 5 + 10 + 10 + 5 + 1 впорядковані набори

    І ми можемо використовувати групи з десятьма випадками (це група з 2 голівками або група з 2 хвостами), щоб вибрати (з однаковою ймовірністю) число. Це трапляється у 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 фліп - це 1716732231704=227

Це обумовлює значення очікування кількості фліпів за один виток, що обумовлює успіх і p = 0,5:

5716+6732+7231704=5.796875

Значення очікування для загальної кількості фліп (до досягнення успіху), умовне p = 0,5, стає:

(5716+6732+7231704)27272=539=5.88889


Відповідь NcAdams використовує варіацію цієї стратегії зупиняючого правила (щоразу придумуючи дві нові монети), але не вибирає оптимально всі ручки.

Відповідь Кліда може бути також подібною, хоча може існувати нерівномірне правило вибору, згідно з яким кожна дві монети може перевернути номер, але необов'язково з однаковою ймовірністю (розбіжність, яка відновлюється під час пізніших гортань монети)


Порівняння з іншими методами

Інші методи, що використовують аналогічний принцип, - це NcAdams та AdamO.

Принцип такий : рішення про число між 1 і 7 приймається після певної кількості голів і хвостів. Після кількості x переворотів, для кожного рішення, яке призводить до числа i існує аналогічне, однаково вірогідне рішення, яке призводить до числа j (однакова кількість голів і хвостів, але лише в іншому порядку). Деякі серії голів та хвостів можуть призвести до того, щоби почати спочатку.

Для таких типів методів один із розміщених тут є найбільш ефективним, оскільки він приймає рішення якомога раніше (як тільки з’явиться можливість для 7 рівних послідовностей імовірностей головок і хвостів, після x -го перевороту ми можемо використовувати їх для прийняття рішення про число, і нам не потрібно гортати далі, якщо ми стикаємося з одним із цих випадків).

Це показано на зображенні та моделюванні нижче:

порівняння

#### 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(1p) для кращого порівняння:

порівняння зі масштабованими значеннями очікування

збільшення масштабів порівняння методів, описаних у цій публікації та коментарях

описані тут методи порівняння

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


Автор StackExchangeStrike


Я тільки збирався почати робити обчислення для випадку n = 7, тому що у мене було відчуття, що це може бути краще, ніж n = 1. Попросіть мого рішення, сер!
М.Герцкам

@ M.Herzkamp невелике поліпшення все ще можливо. Одне число (один монет перевернути) не потрібне для обчислення X , оскільки воно має коефіцієнт 0. Це число необхідно лише для визначення випадку всіх голів або всіх хвостів, і його можна опустити, коли ми вже знаємо, що у нас є змішаний випадок. CkX
Секст Емпірік

Таким чином покращення зводить його до трохи більше 6 монет, як очікуване число необхідних обертів монети. Це було б різним, хоча і підтверджувати, що це оптимальне рішення. Схема, створена Clid, трохи розходиться, що дозволяє вибирати число при певній кількості монет, що перегортається, але не з однаковою ймовірністю (принаймні, не для цього конкретного кроку, це буде виправлено пізніше).
Секст Емпірік

Але якщо ви вирішили перевернути шосту монету на основі перших п’яти результатів, чи вірогідність кожного набору обумовлюється тим, що ви отримали шість оборотів, такі ж, як і для інших наборів?
Накопичення

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

20

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

π

p=1p=0


2
Чи можете ви запропонувати спосіб розділити вікно на сім рівних областей, щоб мінімізувати ухили від перевертання, відскаку від стін тощо? Сім секторів кута 360/7?
smci

1
@smci Ось чому я зазначаю, що ви повинні кинути монету, щоб була однакова ймовірність її посадки в кожному квадраті. Якщо відскок від стіни впливає на цю ймовірність, то вам доведеться це враховувати під час кидка.
Відновіть Моніку

17
Так, я це знаю, і я вказую на вас, що просто сказати "киньте його неупереджено", не визначаючи, як саме цього досягти, насправді не є повною відповіддю ... в такому випадку гортання-H / T засновані на методах вищі.
smci

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

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

8

EDIT: на основі відгуків інших.

Ось цікава думка:

встановити список {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


Оцінка вартості очікування для кількості викинутих монет

xy

M=[q700000117p1q6q600000021p2q56p1q5q50000035p3q415p2q45q4q4000035p4q320p3q310p2q34p1q3q300021p5q215p4q210p3q26p2q23p1q2q2007p6q16p5q15p4q14p3q13p2q12p1q100p7p6p5p4p3p200]

(MI)v=0

E(n)=247p(1p)

порівняння величини очікування на монетах

p>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
Ця ідея справді приємна, але з великою часткою ймовірності для голови (вибити це число) я думаю, що останнє число в ряду має найкращі шанси «вижити», оскільки всі інші infront будуть вигнані дуже ймовірно перед тим, як пройти 1? Може бути, це можна змінити не послідовно кидаючи монету, а паралельно для всіх чисел у х? Час виконання сценарію може збільшитись, мабуть :)
TinglTanglBob

2
Я погоджуюся з @TinglTanglBob - коли я встановлюю, p <- 0.99я отримую вихід0.89 0.02 0.02 0.02 0.02 0.02 0.02
Silverfish

6
Не вдалося б усунути усунення в «раундах», щоб виправити проблему зміщення? Почніть з 7 чисел. Киньте монету за кожну кількість, що залишилася, і усуньте ті, що кидають голову. Якщо всі решти числа вилучені в раунді, подряпайте результати цього раунду і повторіть спробу. Я не знаю, як це довести, але інтуїтивно порядок чисел вже не має значення в тому, чи є вони "переможцем"
Філ

1
p=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 як можливого значення. Це було розміщено перед редакцією ОП і майже одночасно як 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]00006666k

Це те саме для одного виходу, правда? Просто краще для кількох? Я б написав це так, як diff *= 7мені здається ... насправді, немає особливої ​​необхідності використовувати однакову базу для кожної спроби.
o11c

Так, це те саме, якщо ви хочете отримати один вихід; це підвищує ефективність лише у тому випадку, якщо потрібно кілька.
Федеріко Полоні

pp

Це абсолютно робить відходи, якщо ви хочете отримати один вихід. Для справедливої ​​монети стандартна техніка (згортайте монету тричі та повторіть, якщо отримаєте TTT) дає очікуване число 24/7 = 3 + 3/7 рулонів. Якщо ви використовуєте цю техніку стилю арифметичного кодування, ви прокочуєте щонайменше чотири рази, якщо не отримуєте HHH або TTT, що дає очікувану кількість більше 15/4 = 3 + 3/4 рулону.
Пітер Шор

3

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

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

pf(p)f f(p)=min{1,2p}N випробувань.


2

p1p0

Спочатку ми перетворюємо (можливо) несправедливу монету в справедливу монету, використовуючи процес з відповіді 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(n1)/717


1
1/7

1
1/7k=1(1/8)k=17

1
nT(n)=2n62nn3
3+n=31T(n)=4.5
8733.42

2

Натхненний відповіддю Адамо, ось рішення 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

Тут є дві основні зміни: Основна полягає в тому, що якщо все число відкидається в раунді, повторіть раунд. Також я перекладаю вибір на те, чи означає голову чи хвости кожен раз відкидати. Це зменшує кількість обертів, необхідних у випадках, коли р близький до 0 або 1 на ~ 70%, коли р = 0,999


2
"Я перекладаю вибір на те, чи означає голову чи хвости кожен раз відкидати. Це зменшує кількість обертів, необхідних у випадках, коли р близький до 0 або 1 на ~ 70%, коли р = 0,999" - розумне мислення!
Срібна рибка

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

2

Здається, нам дозволяється змінювати відображення результату кожного перевороту щоразу, коли ми гортаємо . Отже, використовуючи для зручності перші сім натуральних чисел, ми даємо наступні замовлення:

Н1
Н2

Н7
Н1

тощо

Т


АПТ

ПАП(не створюються цілі числа)=(1-p)7

Nб

РахуватиАП(марні сальто)7Nб(1-p)7

Б(p,н=5)p3(1-p)2

ПDS(не створюються цілі числа)=1-7p3(1-p)2

Тут буде схильна кількість непотрібних фліп

CountDS(useless flips)5Nb[17p3(1p)2]

AP

CountAP(useless flips)<CountDS(useless flips)

7Nb(1p)7<5Nb[17p3(1p)2]

7(1p)7<5[17p3(1p)2]

p>0.0467AP

pAPDSp0.5967

CountAP(useless flips)CountDS(useless flips)

0.67p=0.10.3p=0.20.127p=0.4


p(0,1)

1
@Sycorax Я щось додав, хоча я не впевнений, що це так, як ви запропонували.
Алекос Пападопулос

Н

1
12345679999999

1
Цю послідовність можна чітко відрізнити від послідовності iid уніформ на {1..7}. Для всіх, крім одного конкретного значенняp, ймовірність того, що перше значення буде 1, не є 17. Для будь-якого значенняp, випадок, коли друге значення дорівнює 2, не буде незалежним від події, коли перше значення дорівнює 1. Послідовність, яка в середньому має рівне число кожного значення, є набагато слабкішою умовою, що ідентична форма. Наприклад, послідовність, коли я обираю число справедливо і повторюю його мільйон разів, задовольняє першу умову (і набагато ефективніше, ніж ця відповідь).
jwg
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.