Teaser não: Làm thế nào để tạo 7 số nguyên với xác suất bằng nhau bằng cách sử dụng đồng xu thiên vị có pr (head) = p?


58

Đây là một câu hỏi tôi tìm thấy trên Glassdoor : Làm thế nào để tạo ra 7 số nguyên với xác suất bằng nhau bằng cách sử dụng một đồng tiền có ?Pr(Head)=p(0,1)

Về cơ bản, bạn có một đồng xu có thể có hoặc không công bằng và đây là quy trình tạo số ngẫu nhiên duy nhất bạn có, do đó, hãy đến với trình tạo số ngẫu nhiên tạo ra các số nguyên từ 1 đến 7 trong đó xác suất nhận được từng số nguyên này là 1/7.

Hiệu quả của các vấn đề quá trình tạo dữ liệu.



12
Có vô số cách để thực hiện điều này. Một phiên bản thú vị hơn của câu hỏi yêu cầu phương pháp tốt nhất theo nghĩa được xác định rõ. Một cảm giác tự nhiên tốt nhất sẽ là số lần lật ít được mong đợi nhất trên mỗi số nguyên được tạo. Một phiên bản thú vị khác là mô tả tất cả các giải pháp có thể (dựa vào các lần lật độc lập của đồng xu và không có gì hơn).
whuber

1
@whuber gợi ý tốt, tôi đã chỉnh sửa câu hỏi để phản ánh nhận xét của bạn.
Amazonia

<<< Về cơ bản, bạn có một đồng xu có thể có hoặc không công bằng và đây là quy trình tạo số ngẫu nhiên duy nhất bạn có >>> Điều này có nghĩa là, sử dụng đồng xu theo bất kỳ phương pháp nào khác ngoài việc lật nó và kiểm tra đầu so với đuôi là "bị cấm", vì nó sẽ là một quá trình tạo số ngẫu nhiên khác?
TinglTanglBob

9
Mod 7 của năm trên coin.
Nat

Câu trả lời:


56

Lật đồng xu hai lần. Nếu nó hạ cánh HHhoặc TT, bỏ qua nó và lật nó hai lần nữa.

Bây giờ, đồng xu có xác suất bằng HThoặc sắp tới TH. Nếu nó đi lên HT, gọi đây H1. Nếu nó đi lên TH, gọi đây T1.

Tiếp tục có được H1hoặc T1cho đến khi bạn có ba liên tiếp. Ba kết quả này cung cấp cho bạn một số dựa trên bảng dưới đây:

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]

Tôi lập luận rằng điều này sẽ hoạt động hoàn toàn tốt, mặc dù bạn sẽ có rất nhiều cú ném lãng phí trong quá trình này!


4
Hạn chế duy nhất là xác suất của các đầu là "p". Lưu ý rằng p có thể là hoặc . Vì vậy, điều này không được đảm bảo để hoạt động, nhưng Sycorax (hoặc Sephan's) sẽ hoạt động, ngay cả trong những trường hợp đó. 101
gung - Phục hồi Monica

8
@gung: Tôi không chắc chắn tôi sẽ làm việc cho một đồng xu có hai đầu hoặc hai đuôi.
S. Kolassa - Tái lập Monica

6
Với xác suất nó sẽ kết thúc trong thời gian hữu hạn. 1
clark

18
Điều này được gọi là làm trắng Von-Neuman.
DonFusili

4
Bạn có thể lặp lại trình trích xuất von Neumann để trích xuất đầy đủ hơn entropy từ chuỗi. Tập hợp tất cả các cặp HH và TT, xem xét rằng một chuỗi, áp dụng trình trích xuất von Neumann cho điều đó, v.v.
Một Simmons

47

Giả sử rằng .p(0,1)

Bước 1 : . Tung đồng xu 5 lần.

Nếu kết quả là

1(H,H,H,T,T) , quay lại và dừng lại.1

2(H,H,T,T,H) , quay lại và dừng lại.2

3(H,T,T,H,H) , quay lại và dừng lại.3

4(T,T,H,H,H) , quay lại và dừng lại.4

5(T,H,H,H,T) , quay lại và dừng lại.5

6(H,H,T,H,T) , quay lại và dừng lại.6

7(H,T,H,T,H) , quay lại và dừng lại.7

Bước 2 : . Nếu kết quả không có gì ở trên, lặp lại Bước 1.

Lưu ý rằng bất kể giá trị của , mỗi trong số bảy kết quả được liệt kê ở trên có xác suất và số lần tung đồng xu dự kiến ​​là . Người tung không cần biết giá trị của (ngoại trừ và ); đảm bảo rằng bảy số nguyên có khả năng được trả về bằng nhau bởi thử nghiệm khi kết thúc (và nó được đảm bảo kết thúc với xác suất ).q = p 3 ( 1 - p ) 2 5p(0,1)q=p3(1p)2 pp057qpp01p11


6
Chúng ta có thể giảm số lần tung dự kiến ​​cho việc này bằng cách cho phép chuỗi được chỉ định ở đây HOẶC chuỗi đó với mỗi lần lật được đảo ngược. ví dụ: Cho 1, hoặc (H, H, H, T, T) hoặc (T, T, T, H, H)?
thêm vào

5
Bạn có thể thêm phần bổ sung là tốt. Nếu kết quả là (H, H, H, T, T) hoặc (T, T, T, H, H), trả về 1 và dừng lại, v.v. Trong trường hợp đó xác suất cho mỗi kết quả là . q=p3(1p)2+p2(1p)3
Sextus Empiricus

2
Không thể chỉ cần thêm một lần lật đồng xu khác nếu kết quả không bị mất bất kỳ sự sắp xếp (H, H, H, T, T) nào? Với việc tung đồng xu bổ sung, bạn cần một ánh xạ khác của (H, H, H, T, T, T) và (H, H, T, T, T, T) và mỗi kết hợp xT (7-x) H có thể được sắp xếp theo 7 hoặc nhiều thứ tự khác nhau cho các số từ 1 đến 7. Thay vì lấy lại tất cả 5 đồng xu, điều này sẽ chỉ thêm 1 lần tung, nhưng tôi không chắc liệu nó có hoạt động không: D
TinglTanglBob

5
Có thể đó là điều tốt nhất để lật đồng xu ngay lập tức 7 lần, vì nó được bảo đảm, rằng bạn sẽ nhận được một số ngẫu nhiên từ nó (chỉ có ngoại lệ là, đồng xu sẽ ngẩng lên hoặc nối đuôi cả 7 lần thử) . Vì vậy, với 7 lần ném, bạn có thể kết thúc với 1 đến 6 đầu (tôi loại trừ tùy chọn 0 và 7 ở đây vì nó vô nghĩa). Nếu một đầu có 7 cách sắp xếp khác nhau (H, T, T, T, T, T, T) có thể; Nếu 2 đầu 21; nếu 3 đầu 35; nếu 4 35 đầu; nếu 5 21 đầu; nếu 6 7 đầu; Mỗi có thể được ánh xạ hoàn hảo đến số 1-7 mà không mất bất kỳ sự kết hợp nào.
TinglTanglBob

2
@TinglTanglBob Đây thực chất là câu trả lời của Martijn Weterings ;-)
M.Herzkamp

22

Tổng quát hóa trường hợp được mô tả bởi Dilip Sarwate

Một số phương pháp được mô tả trong các câu trả lời khác sử dụng sơ đồ trong đó bạn ném một chuỗi xu trong một 'lượt' và tùy thuộc vào kết quả bạn chọn một số trong khoảng từ 1 đến 7 hoặc loại bỏ lượt và ném lại.n

Bí quyết là tìm ra sự mở rộng các khả năng có nhiều kết quả gồm 7 kết quả với cùng xác suất và khớp các kết quả này với nhau.pk(1p)nk

Vì tổng số kết quả không phải là bội số của 7, chúng tôi có một vài kết quả mà chúng tôi không thể chỉ định cho một số và có một số xác suất mà chúng tôi cần loại bỏ kết quả và bắt đầu lại.


Trường hợp sử dụng 7 lần lật đồng xu mỗi lượt

Theo trực giác chúng ta có thể nói rằng việc gieo xúc xắc bảy lần sẽ rất thú vị. Vì chúng ta chỉ cần loại bỏ 2 trong số khả năng. Cụ thể, 7 lần đầu và 0 lần đầu.27

Đối với tất cả các khả năng , luôn có bội số của 7 trường hợp có cùng số lượng đầu. Cụ thể là 7 trường hợp có 1 đầu, 21 trường hợp có 2 đầu, 35 trường hợp có 3 đầu, 35 trường hợp có 4 đầu, 21 trường hợp có 5 đầu và 7 trường hợp có 6 đầu.272

Vì vậy, nếu bạn tính số (loại bỏ 0 đầu và 7 đầu)

X=k=17(k1)Ck

với các biến phân phối Bernoulli (giá trị 0 hoặc 1), thì X modulo 7 là biến đồng nhất với bảy kết quả có thể.Ck


So sánh số lần lật đồng xu khác nhau mỗi lượt

Câu hỏi vẫn là số lượng cuộn tối ưu mỗi lượt sẽ là bao nhiêu. Lăn nhiều xúc xắc hơn mỗi lượt sẽ khiến bạn tốn nhiều tiền hơn, nhưng bạn giảm khả năng phải quay lại.

Hình ảnh dưới đây cho thấy một tính toán thủ công cho một số lần lật đồng xu đầu tiên mỗi lượt. (có thể có một giải pháp phân tích, nhưng tôi tin rằng có thể an toàn khi nói rằng một hệ thống với 7 lần lật đồng xu cung cấp phương pháp tốt nhất liên quan đến giá trị kỳ vọng cho số lần lật đồng xu cần thiết)

số lượng xu dự kiến

# 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)
}

Sử dụng quy tắc dừng sớm

lưu ý: các tính toán dưới đây, đối với giá trị kỳ vọng của số lần lật, đối với một đồng xu công bằng , nó sẽ trở thành một mớ hỗn độn để làm điều này cho các khác nhau , nhưng nguyên tắc vẫn giữ nguyên (mặc dù cách giữ sổ khác nhau của trường hợp là cần thiết)p=0.5p

Chúng ta có thể chọn các trường hợp (thay vì công thức cho ) sao cho chúng ta có thể dừng lại sớm hơn.X

  • Với 5 lần lật đồng xu, chúng tôi có sáu bộ đầu và đuôi không có thứ tự khác nhau:

    1 + 5 + 10 + 10 + 5 + 1 bộ đã đặt hàng

    Và chúng ta có thể sử dụng các nhóm có mười trường hợp (đó là nhóm có 2 đầu hoặc nhóm có 2 đuôi) để chọn (với xác suất bằng nhau) một số. Điều này xảy ra trong 14 trên 2 ^ 5 = 32 trường hợp. Điều này để lại cho chúng tôi:

    1 + 5 + 3 + 3 + 5 + 1 bộ đã đặt hàng

  • Với một lần lật thêm (6) đồng xu, chúng ta có bảy bộ đầu và đuôi không có thứ tự khác nhau có thể:

    1 + 6 + 8 + 6 + 8 + 6 + 1 bộ đã đặt hàng

    Và chúng ta có thể sử dụng các nhóm có tám trường hợp (đó là nhóm có 3 đầu hoặc nhóm có 3 đuôi) để chọn (với xác suất bằng nhau) một số. Điều này xảy ra trong 14 trên 2 * (2 ^ 5-14) = 36 trường hợp. Điều này để lại cho chúng tôi:

    1 + 6 + 1 + 6 + 1 + 6 + 1 bộ đã đặt hàng

  • Với một lần lật thêm 7 (7) khác, chúng tôi có tám bộ đầu và đuôi không có thứ tự khác nhau có thể:

    1 + 7 + 7 + 7 + 7 + 7 + 7 + 1 bộ đã đặt hàng

    Và chúng ta có thể sử dụng các nhóm với bảy trường hợp (tất cả ngoại trừ tất cả các đuôi và tất cả các trường hợp đầu) để chọn (với xác suất bằng nhau) một số. Điều này xảy ra trong 42 trên 44 trường hợp. Điều này để lại cho chúng tôi:

    1 + 0 + 0 + 0 + 0 + 0 + 0 + 1 bộ được đặt hàng

    (chúng ta có thể tiếp tục điều này nhưng chỉ trong bước thứ 49, điều này mới mang lại lợi thế cho chúng ta)

Vì vậy, xác suất để chọn một số

  • tại 5 lần lật là1432=716
  • tại 6 lần lật là9161436=732
  • tại 7 lần lật là11324244=231704
  • không trong 7 lần lật là1716732231704=227

Điều này làm cho giá trị kỳ vọng cho số lần lật trong một lượt, có điều kiện là có thành công và p = 0,5:

5716+6732+7231704=5.796875

Giá trị kỳ vọng cho tổng số lần lật (cho đến khi có thành công), có điều kiện p = 0,5, trở thành:

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


Câu trả lời của NcAdams sử dụng một biến thể của chiến lược quy tắc dừng này (mỗi lần đưa ra hai lần lật đồng xu mới) nhưng không tối ưu chọn ra tất cả các lần lật.

Câu trả lời của Clid cũng có thể tương tự mặc dù có thể có một quy tắc lựa chọn không đồng đều rằng mỗi hai đồng xu lật một số có thể được chọn nhưng không nhất thiết phải có xác suất bằng nhau (sự khác biệt đang được sửa chữa trong lần lật đồng xu sau)


So sánh với các phương pháp khác

Các phương pháp khác sử dụng một nguyên tắc tương tự là phương pháp của NcAdams và AdamO.

Nguyên tắc là : Một quyết định cho một số từ 1 đến 7 được đưa ra sau một số đầu và đuôi nhất định. Sau một số flips, đối với mỗi quyết định dẫn đến một số có một tương tự, đều có thể xảy ra, quyết định dẫn đến một số (cùng một số người đứng đầu và đuôi nhưng chỉ theo một thứ tự khác nhau). Một số loạt đầu và đuôi có thể dẫn đến quyết định bắt đầu lại.xij

Đối với loại phương pháp như vậy, phương pháp được đặt ở đây là hiệu quả nhất vì nó đưa ra quyết định càng sớm càng tốt (ngay khi có khả năng 7 chuỗi xác suất bằng nhau của đầu và đuôi, sau khi lật , chúng ta có thể sử dụng họ đưa ra quyết định về một con số và chúng ta không cần phải lật thêm nếu chúng ta gặp phải một trong những trường hợp đó).x

Điều này được thể hiện bằng hình ảnh và mô phỏng dưới đây:

so sánh

#### 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)
}

một hình ảnh khác được chia tỷ lệ bởi để so sánh tốt hơn:p(1p)

so sánh với các giá trị kỳ vọng tỷ lệ

phóng to so sánh các phương pháp được mô tả trong bài viết này và ý kiến

phương pháp so sánh được mô tả ở đây

'bỏ qua điều kiện của bước thứ 7' là một cải tiến nhỏ có thể được thực hiện theo quy tắc dừng sớm. Trong trường hợp này, bạn chọn không phải nhóm có xác suất bằng nhau sau lần lật thứ 6. Bạn có 6 nhóm với xác suất bằng nhau và 1 nhóm có xác suất hơi khác nhau (đối với nhóm cuối cùng này, bạn cần lật thêm một lần nữa khi bạn có 6 đầu hoặc đuôi và vì bạn loại bỏ 7 đầu hoặc 7 đuôi, bạn sẽ kết thúc với cùng một xác suất sau tất cả)


Được viết bởi StackExchangeStrike


Tôi mới bắt đầu thực hiện các phép tính cho trường hợp n = 7, bởi vì tôi có cảm giác nó có thể tốt hơn n = 1. Có upvote của tôi, thưa ông!
M.Herzkamp

CkX

Vì vậy, sự cải tiến mang lại cho nó ít hơn 6 lần lật đồng xu như giá trị kỳ vọng cho số lần lật đồng xu cần thiết. Nó sẽ thay đổi mặc dù để chứng minh rằng đây là giải pháp tối ưu. Lược đồ được tạo bởi Clid phân kỳ một chút cho phép chọn một số tại một số lần lật đồng xu cụ thể nhưng không có xác suất bằng nhau (ít nhất là không phải cho bước cụ thể đó, nó sẽ được sửa sau).
Sextus Empiricus

Nhưng nếu bạn quyết định có nên lật đồng xu thứ sáu dựa trên năm kết quả đầu tiên, thì xác suất của mỗi bộ, với điều kiện bạn có đến sáu lần lật, giống như với các bộ khác không?
Tích lũy

@Acccumulation bạn có thể vẽ nó dưới dạng cây nhị phân với 7 cấp độ. Chúng tôi sẽ chỉ chọn trong số các nút nếu có 7 với xác suất bằng nhau. Nó giống như bạn chặt một số nhánh trước đó (ở cấp 5 hoặc 6). Nếu bạn thích thì bạn có thể tiếp tục cho đến 7 bước, thay vì trước đó, nhưng đối với những trường hợp cụ thể này, việc lật đồng xu thứ 6 và thứ 7 không tạo ra sự khác biệt.
Sextus Empiricus

20

Chia một hộp thành bảy vùng có diện tích bằng nhau, mỗi vùng được dán nhãn bằng một số nguyên. Ném đồng xu vào hộp theo cách mà nó có xác suất hạ cánh bằng nhau ở mỗi khu vực.

π

p=1p=0


2
Bạn có thể đề xuất một cách để chia hộp thành bảy vùng có diện tích bằng nhau, để giảm thiểu sai lệch khi lật, bật khỏi tường, v.v.? Bảy lĩnh vực góc 360/7?
smci

1
@smci Đó là lý do tại sao tôi quy định rằng bạn phải ném đồng xu để có xác suất thống nhất về việc nó hạ cánh ở mỗi ô vuông. Nếu bật ra khỏi bức tường ảnh hưởng đến xác suất đó, thì bạn phải tính đến nó trong cú ném của mình.
Tái lập lại

17
Vâng tôi biết điều đó, và tôi chỉ ra cho bạn rằng chỉ cần nói "ném nó theo cách không thiên vị" mà không xác định chính xác làm thế nào để đạt được điều đó, thực sự không phải là một câu trả lời đầy đủ ... trong trường hợp đó là lật-H / T phương pháp dựa trên là ưu việt.
smci

1
"Các khu vực bằng nhau, với các cú ném có xác suất hạ cánh bằng nhau ở mỗi khu vực" có thể khó thiết lập trong thực tế. Trong thực tế, có thể dễ dàng hơn để đánh dấu một số lượng lớn "chạy thực hành" và sau đó chia khu vực hạ cánh thành các không gian có thể trang bị theo kinh nghiệm (ví dụ: với 700 lần ném, loại bỏ một đường cắt đứt 100 lần ném xa nhất, sau đó là một lần tiếp theo 100 và cứ thế). Đơn giản hóa việc này để tạo ra một bit ngẫu nhiên duy nhất sẽ là ném đồng xu hai lần - nếu lần ném thứ nhất đi xa hơn, thì bit đó là 0và nếu lần ném thứ hai đi xa hơn thì đó là1
Silverfish

4
Có một câu trả lời hay của @TheScienceBoy, đáng buồn là đã bị xóa bằng một thay thế thú vị cho vấn đề này - một cách hiệu quả, sử dụng đồng xu như một công cụ quay vòng và đánh dấu 7 phần dọc theo chu vi của nó - vẫn giữ được phần lớn tinh thần của câu trả lời này nhưng có thể đơn giản hơn về mặt vật lý quan tâm!
Cá bạc

8

EDIT: dựa trên phản hồi của người khác.

Đây là một suy nghĩ thú vị:

thiết lập danh sách {1,2,3,4,5,6,7}. Ném đồng xu cho từng yếu tố trong danh sách tuần tự. Nếu nó nằm đối diện với một yếu tố cụ thể, hãy xóa số đó khỏi danh sách. Nếu tất cả các số từ một lần lặp cụ thể của danh sách bị xóa, hãy lặp lại lấy mẫu. Làm như vậy cho đến khi chỉ còn một số.

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)

cho tôi một sự phân phối đồng đều

> 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


Đánh giá giá trị kỳ vọng cho số lần ném đồng xu

xy

M=[q700000117p1q6q600000021p2q56p1q5q50000035p3q415p2q45q4q4000035p4q320p3q310p2q34p1q3q300021p5q215p4q210p3q26p2q23p1q2q2007p6q16p5q15p4q14p3q13p2q12p1q100p7p6p5p4p3p200]

(MI)v=0

E(n)=247p(1p)

so sánh giá trị kỳ vọng cho các lần lật đồng xu

p>2/3

Giải pháp được tìm thấy với 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);

Tính toán trong 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
Ý tưởng thông minh (+1). Theo trực giác, nó sẽ hoạt động, vì tính đối xứng sẽ xuất hiện để vô hiệu hóa sự thiên vị đối với bất kỳ số cụ thể nào. Tuy nhiên, tôi muốn thấy một bằng chứng.
Phục hồi Monica

6
Ý tưởng này thực sự rất hay, nhưng với xác suất cao (đánh bại con số đó) tôi nghĩ con số cuối cùng trong hàng có cơ hội tốt nhất để "sống sót" vì tất cả những người khác đứng trước rất có thể bị đuổi ra trước khi chạy 1? Có lẽ nó có thể được thay đổi bằng cách không liên tục ném đồng xu mà song song với tất cả các số trong x? Thời gian chạy của kịch bản có thể tăng tôi đoán :)
TinglTanglBob

2
Tôi đồng ý với @TinglTanglBob - khi tôi đặt, p <- 0.99tôi nhận được đầu ra0.89 0.02 0.02 0.02 0.02 0.02 0.02
Silverfish

6
Sẽ không thực hiện loại bỏ trong 'vòng' khắc phục vấn đề sai lệch? Bắt đầu với 7 số. Tung đồng xu cho mỗi số còn lại, và loại bỏ những người ném đầu. Nếu tất cả các số còn lại bị loại trong một vòng, hãy cào kết quả của vòng đó và thử lại. Tôi không biết làm thế nào để chứng minh điều đó, nhưng theo trực giác thứ tự của các con số không còn quan trọng trong việc chúng có phải là 'người chiến thắng' hay không
Phil

1
p=0.01

5

Câu hỏi hơi mơ hồ, đó là câu hỏi "tạo số nguyên ngẫu nhiên bằng hoặc nhỏ hơn 7 với xác suất bằng nhau", hay nó hỏi "tạo 7 số nguyên ngẫu nhiên có xác suất bằng nhau?" - nhưng không gian của số nguyên là gì?!?

Tôi sẽ cho rằng đó là trường hợp trước, nhưng logic tương tự mà tôi đang áp dụng cũng có thể được mở rộng sang trường hợp sau, một khi vấn đề đó được giải quyết.

Với một đồng xu thiên vị, bạn có thể tạo ra một đồng tiền công bằng bằng cách làm theo quy trình sau: https://en.wikipedia.org/wiki/Fair_coin#Fair_results_from_a_biased_coin

Một số 7 hoặc ít hơn có thể được viết dưới dạng nhị phân dưới dạng ba chữ số {0,1}. Vì vậy, tất cả những gì bạn cần làm là làm theo quy trình trên ba lần và chuyển đổi số nhị phân được tạo thành số thập phân.


1
so sánh câu trả lời của tôi với @NcAdams, rõ ràng tôi bao gồm 0 là kết quả mong muốn có thể có!
Cam.Davidson.Pilon

Tôi không hiểu câu trả lời của bạn khác nhau như thế nào. Nếu bạn bao gồm {0,0,0} -> 1 thì {1,1,1} ánh xạ tới cái gì? Có 8 khả năng.
AdamO

1
000 bản đồ thành 0, do đó nhận xét của tôi về việc bao gồm 0 là giá trị có thể. Điều này đã được đăng trước khi chỉnh sửa OP và gần như đồng thời là NcAdams.
Cam.Davidson.Pilon

Một nửa câu trả lời này là một nhận xét và nội dung thực tế của câu trả lời chỉ là liên kết. Vui lòng đánh vần câu trả lời thực tế của bạn thay vì chỉ liên kết với nó.
Khối

3

Một giải pháp không bao giờ lãng phí lật, giúp rất nhiều cho các đồng tiền rất thiên vị.

Nhược điểm của thuật toán này (ít nhất là bằng văn bản) là nó sử dụng số học chính xác tùy ý. Thực tế, bạn có thể muốn sử dụng nó cho đến khi tràn số nguyên, và chỉ sau đó ném nó đi và bắt đầu lại.

Ngoài ra, bạn cần phải biết thiên vị là gì ... mà bạn có thể không nói, nếu nó phụ thuộc vào nhiệt độ như hầu hết các hiện tượng vật lý.


Giả sử cơ hội của người đứng đầu là, nói, 30%.

  • Bắt đầu với phạm vi [1, 8).
  • Lật đồng xu của bạn. Nếu đứng đầu, sử dụng 30% bên trái, vì vậy phạm vi mới của bạn là [1, 3.1). Khác, sử dụng đúng 70%, vì vậy phạm vi mới của bạn là [3.1, 8).
  • Lặp lại cho đến khi toàn bộ phạm vi có cùng một phần nguyên.

Mã đầy đủ:

#!/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

Điều đó giống nhau cho một đầu ra, phải không? Chỉ tốt hơn cho nhiều? Tôi sẽ viết nó như diff *= 7tôi nghĩ ... trên thực tế, không có nhu cầu cụ thể để sử dụng cùng một cơ sở cho mỗi lần thử.
o11c

Vâng, nó giống nhau nếu bạn muốn một đầu ra duy nhất; nó chỉ cải thiện hiệu quả nếu bạn muốn nhiều cái.
Federico Poloni

pp

Điều này hoàn toàn không lãng phí lật nếu bạn muốn một đầu ra duy nhất. Đối với một đồng tiền công bằng, kỹ thuật tiêu chuẩn (cuộn đồng xu ba lần và lặp lại nếu bạn nhận được TTT) đưa ra số lượng dự kiến ​​là 24/7 = 3 + 3/7 cuộn. Nếu bạn sử dụng kỹ thuật kiểu mã hóa số học này, bạn sẽ cuộn ít nhất bốn lần trừ khi bạn nhận được HHH hoặc TTT, cung cấp cho bạn số lượng dự kiến ​​hơn 15/4 = 3 + 3/4 cuộn.
Peter Shor

3

Như đã đề cập trong các bình luận trước đó, câu đố này liên quan đến bài báo năm 1951 của John von Neumann "Các kỹ thuật khác nhau được sử dụng liên quan đến chữ số ngẫu nhiên" được công bố trên tạp chí nghiên cứu của Cục tiêu chuẩn quốc gia:

nhập mô tả hình ảnh ở đây

pf(p)f f(p)=min{1,2p}N của các thử nghiệm.


2

p1p0

Trước tiên, chúng tôi biến đồng xu không công bằng (có thể) thành một đồng tiền công bằng bằng cách sử dụng quy trình từ câu trả lời của NcAdams :

Lật đồng xu hai lần. Nếu nó hạ cánh HHhoặc TT, bỏ qua nó và lật nó hai lần nữa.

Bây giờ, đồng xu có xác suất bằng HThoặc sắp tới TH. Nếu nó đi lên HT, gọi đây H1. Nếu nó đi lên TH, gọi đây 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

Lấy cảm hứng từ câu trả lời của AdamO, đây là một giải pháp Python tránh sự thiên vị:

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

Có hai thay đổi chính ở đây: Một thay đổi chính là nếu tất cả các số bị loại bỏ trong một vòng, lặp lại vòng. Ngoài ra tôi lật lựa chọn cho dù đầu hay đuôi có nghĩa là loại bỏ mọi lúc. Điều này giúp giảm số lần lật cần thiết trong trường hợp p gần bằng 0 hoặc 1 ~ 70% khi p = 0,999


2
"Tôi lật lựa chọn xem đầu hay đuôi có nghĩa là loại bỏ mọi lúc. Điều này giúp giảm số lần lật cần thiết trong trường hợp p gần 0 hoặc 1 ~ ~ 70% khi p = 0,999" - suy nghĩ thông minh!
Cá bạc

1
Đầu hoặc đuôi thay thế chắc chắn là một cải tiến so với việc luôn loại bỏ đầu - nhưng có lẽ sẽ tốt hơn nếu, sau khi lật một đồng xu cho mỗi tùy chọn còn lại, nếu chúng đều giống nhau, chúng ta sẽ lặp lại phản xạ tất cả chúng, nếu không thì ít nhất là có nhiều đầu như đuôi chúng ta loại bỏ các tùy chọn còn lại tương ứng với các đầu, nếu không chúng ta loại bỏ các tùy chọn còn lại tương ứng với đuôi.
David Cary

2

Có vẻ như chúng ta được phép thay đổi ánh xạ kết quả của mỗi lần lật, mỗi lần chúng ta lật . Vì vậy, sử dụng để thuận tiện cho bảy số nguyên dương đầu tiên, chúng tôi đưa ra các đơn đặt hàng sau:

H1
H2

H7
H1

Vân vân

T


APT

PAP(no integers generated)=(1p)7

Nb

CountAP(useless flips)7Nb(1p)7

B(p,n=5)p3(1p)2

PDS(no integers generated)=17p3(1p)2

Số lượng các lần lật vô dụng ở đây sẽ có xu hướng

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 Tôi đã thêm một cái gì đó, mặc dù tôi không chắc nó nằm dọc theo dòng bạn đề xuất.
Alecos Papadopoulos

H

1
12345679999999

1
p17p
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.