คุณต้องกลิ้งตาย 6 ด้านเพื่อรับหมายเลขทุกครั้งอย่างน้อยหนึ่งครั้งบ่อยแค่ไหน?


41

ฉันเพิ่งเล่นเกมกับลูก ๆ ของฉันซึ่งโดยทั่วไปแล้วจะลดลงไปถึง: ใครก็ตามที่หมุนทุกหมายเลขอย่างน้อยหนึ่งครั้งในการชนะแบบ 6 ด้าน

ในที่สุดฉันก็ชนะและคนอื่น ๆ ก็จบทีหลัง 1-2 ตอนนี้ฉันสงสัย: ความคาดหวังของความยาวของเกมคืออะไร?

ฉันรู้ว่าความคาดหวังของจำนวนม้วนจนกว่าคุณจะกดหมายเลขเฉพาะคือ 6n=1n16(56)n1=6

อย่างไรก็ตามฉันมีสองคำถาม:

  1. มีกี่ครั้งที่คุณต้องกลิ้งตัวตายแบบหกด้านจนกว่าคุณจะได้หมายเลขอย่างน้อยหนึ่งครั้งทุกครั้ง?
  2. ในบรรดาการทดสอบอิสระสี่ครั้ง (เช่นผู้เล่นสี่คน) ความคาดหวังของจำนวนม้วนสูงสุดที่จำเป็นคืออะไร [หมายเหตุ: มันสูงสุดไม่ต่ำสุดเนื่องจากอายุของพวกเขามันเกี่ยวกับการจบมากกว่าที่จะไปถึงที่นั่นก่อนสำหรับลูก ๆ ของฉัน]

ฉันสามารถจำลองผลลัพธ์ได้ แต่ฉันสงสัยว่าฉันจะทำการคำนวณได้อย่างไร


นี่คือการจำลอง Monte Carlo ใน Matlab

mx=zeros(1000000,1);
for i=1:1000000,
   %# assume it's never going to take us >100 rolls
   r=randi(6,100,1);
   %# since R2013a, unique returns the first occurrence
   %# for earlier versions, take the minimum of x
   %# and subtract it from the total array length
   [~,x]=unique(r); 
   mx(i,1)=max(x);
end

%# make sure we haven't violated an assumption
assert(numel(x)==6)

%# find the expected value for the coupon collector problem
expectationForOneRun = mean(mx)

%# find the expected number of rolls as a maximum of four independent players
maxExpectationForFourRuns = mean( max( reshape( mx, 4, []), [], 1) )

expectationForOneRun =
   14.7014 (SEM 0.006)

maxExpectationForFourRuns =
   21.4815 (SEM 0.01)

11
ปัญหาของผู้สะสมคูปองก็เห็นเช่นกัน- googling จะให้ความนิยมมากขึ้นและข้อมูลเพิ่มเติม นอกจากนี้ยังพยายามค้นหาในที่นี่ที่ stats.SE
Glen_b

1
@Glen_b: ขอบคุณฉันไม่รู้ชื่อนั้นเลย!
Jonas

1
@whuber: ฉันไม่แน่ใจว่าคำถามนี้ควรถูกปิด เขาต้องการเวลากดปุ่มต่ำสุดที่คาดไว้ของการทดลองสี่ครั้ง ฉันเพิ่งจะแก้ไขคำตอบของฉันสำหรับโซลูชันการเขียนโปรแกรมแบบไดนามิก
Neil G

2
@whuber: ฉันจะแก้ไขโพสต์ของฉันเพื่อชี้แจง
Jonas

คำตอบ:


22

เนื่องจากมีการร้องขอ "วิธีการวิเคราะห์ที่สมบูรณ์" นี่เป็นคำตอบที่ถูกต้อง นอกจากนี้ยังมีวิธีทางเลือกในการแก้คำถามที่น่าจะเป็นการวาดลูกบอลสีดำในชุดของลูกบอลสีดำและสีขาวที่มีเงื่อนไขทดแทนผสม


จำนวนของการเคลื่อนไหวในเกม, , สามารถจำลองเป็นผลรวมของการรับรู้อิสระหกตัวแปรทางเรขาคณิตมีความน่าจะเป็นแต่ละคนเลื่อนไป (เนื่องจากตัวแปรทางเรขาคณิตนับเฉพาะม้วนก่อนหน้าความสำเร็จและเราต้องนับม้วนที่สังเกตเห็นความสำเร็จ) โดยการคำนวณด้วยการแจกแจงเชิงเรขาคณิตเราจะได้คำตอบที่น้อยกว่าคำตอบที่ต้องการข้อและต้องแน่ใจว่าจะเพิ่มคำตอบตอนท้ายX(p)p=1,5/6,4/6,3/6,2/6,1/616 666

ฟังก์ชั่นการสร้างความน่าจะเป็น (PGF) เช่นตัวแปรทางเรขาคณิตที่มีพารามิเตอร์คือp

f(z,p)=p1(1p)z.

ดังนั้น pgf สำหรับผลรวมของตัวแปรทั้งหกนี้คือ

g(z)=i=16f(z,i/6)=6z4(5 2z+5+10 3z+45 4z+4+5z+4+5).

(ผลิตภัณฑ์สามารถคำนวณได้ในรูปแบบปิดนี้โดยแยกเป็นห้าคำผ่านเศษส่วนบางส่วน)

ฟังก์ชันการแจกแจงสะสม (CDF) ได้มาจากผลรวมบางส่วนของ (เป็นอนุกรมกำลังไฟฟ้าใน ) ซึ่งมีจำนวนเป็นผลรวมของอนุกรมทางเรขาคณิตและได้รับจากgz

F(z)=6z4((1) 1z+4+(5) 2z+4(10) 3z+4+(10) 4z+4(5) 5z+4+(1) 6z+4).

(ฉันได้เขียนนิพจน์นี้ในรูปแบบที่แสดงถึงการสืบทอดทางเลือกผ่านหลักการของการรวม - ไม่รวม)

จากนี้เราได้รับจำนวนการเคลื่อนไหวที่คาดไว้ในเกม (ตอบคำถามแรก) เป็น

E(6+X)=6+i=1(1F(i))=14710.

CDF ของค่าสูงสุดของเวอร์ชันอิสระของคือ (และจากนี้เราสามารถโดยทั่วไปตอบคำถามความน่าจะเป็นเกี่ยวกับค่าสูงสุดที่เราชอบเช่นค่าความแปรปรวนของมันคืออะไร 99 เปอร์เซ็นไทล์ และอื่น ๆ ) ด้วยเราได้รับความคาดหวังจากmXF(z)mm=4

6+i=1(1F(i)4)21.4820363.

(ค่าเป็นเศษส่วนแบบมีเหตุผลซึ่งในรูปแบบลดลงมีตัวส่วน 71 หลัก) ส่วนเบี่ยงเบนมาตรฐานคือ นี่คือพล็อตของฟังก์ชั่นความน่าจะเป็นจำนวนมากที่สุดสำหรับผู้เล่นสี่คน (ซึ่งได้รับการเลื่อนแล้ว):6.77108.6

รูป

อย่างที่ใคร ๆ ก็คาดหวังมันจะเบ้ในทางบวก โหมดอยู่ที่ม้วน เป็นเรื่องยากที่คนสุดท้ายที่จะเสร็จจะต้องใช้เวลามากกว่าม้วน (ประมาณ )18500.3%


วิธีการแก้ปัญหานี้ได้รับแรงบันดาลใจจากการสังเกตว่าผลรวมของตัวแปรเรขาคณิตเป็นของผสม (อาจมีน้ำหนักเป็นลบ) ของตัวแปรเรขาคณิตที่มีพารามิเตอร์เดียวกัน ความสัมพันธ์ที่เหมือนกันนี้อยู่ระหว่างตัวแปร Gamma (ด้วยพารามิเตอร์อัตราที่ต่างกัน) ฉันขอโทษที่ทำงานในMathematicaแต่ฉันแน่ใจว่า Matlab สามารถทำการคำนวณเหล่านี้ได้เช่นกัน :-)
whuber

2
นี่คือคำตอบที่ฉันหวังไว้ ขอบคุณมาก! ฉันคิดว่าฉันควรจะสามารถคำนวณผลลัพธ์ที่เป็นตัวเลขใน Matlab :)
Jonas

อย่างไรเกี่ยวข้องกับการกระจายมวลความน่าจะเป็นของการกระจายเรขาคณิต? ผลิตภัณฑ์ มาจากไหน ฉันได้รับความหมายของแต่ความหมายของคืออะไร? f(z,p)=p1(1p)zi=16f(z,i/6)F(z)g(z)
Sextus Empiricus

1
ฉันเห็นแล้วว่าเป็นฟังก์ชันสร้างความน่าจะเป็น f(z,p)
Sextus Empiricus

@ MartijnWeterings ขอบคุณ - ฉันเชื่อว่านั่นเป็นคำที่ถูกต้องและเป็นธรรมมากขึ้น (คุณสามารถบอกได้ว่าฉันมักจะนึกถึง pmf และ pgf เกือบเหมือนกันเนื่องจากนิสัยการใช้งานฟังก์ชั่นที่ยาวนาน) ฉันจะเปลี่ยนคำศัพท์ในบทความนี้
whuber

13

โรงรับจำนำมีความคิดที่ถูกต้องในการโจมตีปัญหาที่มีความสัมพันธ์ที่เกิดซ้ำ พิจารณาลูกโซ่มาร์คอฟที่มีสถานะสอดคล้องกับการนับจำนวนของการทอยลูกเต๋าที่เกิดขึ้น สถานะ 0 คือสถานะเริ่มต้นและสถานะ 6 เป็นสถานะเสร็จสิ้น จากนั้นน่าจะเป็นของการเปลี่ยนแปลงจากรัฐไปที่ตัวเองเป็น{6} ความน่าจะเป็นของการเปลี่ยนแปลงจากรัฐจะระบุคือ{6} ดังนั้นเวลากดปุ่มของสถานะเสร็จสิ้นคือ {0,,6}ii6ii+16i6

i=0566i=14.7

สำหรับการทดลองสูงสุดสี่ครั้งให้พิจารณาสถานะที่เป็นสี่เท่า คุณต้องการที่จะหาเวลาที่คาดว่าตีรัฐเป้าหมาย(6,6,6,6)เวลาในการชนที่คาดหวังของสถานะใด ๆคือค่าเฉลี่ยถ่วงน้ำหนักสำหรับแต่ละสถานะต้นทางของเวลากดปุ่มที่คาดหวังบวกเวลาที่จะไปจากถึง , ถ่วงน้ำหนักโดยความน่าจะเป็นที่จะมาถึงสถานะและย้ายไป(6,6,6,6)jiTiijpipijij. คุณสามารถค้นหาเวลาการชนและความน่าจะเป็นได้ด้วยการเขียนโปรแกรมแบบไดนามิก มันไม่ยากนักเนื่องจากมีคำสั่งการแวะผ่านเพื่อเติมเวลาการกดปุ่มและความน่าจะเป็น ตัวอย่างเช่นสำหรับสองคนแรกให้คำนวณ T และ p สำหรับ (0,0) จากนั้นสำหรับ (1,0) จากนั้น (1, 1), (2, 0), จากนั้น (2, 1) เป็นต้น

ใน Python:

import numpy as np
import itertools as it
from tools.decorator import memoized  # A standard memoization decorator

SIDES = 6

@memoized
def get_t_and_p(state):
    if all(s == 0 for s in state):
        return 0, 1.0
    n = len(state)
    choices = [[s - 1, s] if s > 0 else [s]
               for s in state]
    ts = []
    ps = []
    for last_state in it.product(*choices):
        if last_state == state:
            continue
        last_t, last_p = get_t_and_p(tuple(sorted(last_state)))
        if last_p == 0.0:
            continue
        transition_p = 1.0
        stay_p = 1.0
        for ls, s in zip(last_state, state):
            if ls < s:
                transition_p *= (SIDES - ls) / SIDES
            else:
                transition_p *= ls / SIDES
            stay_p *= ls / SIDES
        if transition_p == 0.0:
            continue
        transition_time = 1 / (1 - stay_p)
        ts.append(last_t + transition_time)
        ps.append(last_p * transition_p / (1 - stay_p))
    if len(ts) == 0:
        return 0, 0.0
    t = np.average(ts, weights=ps)
    p = sum(ps)
    return t, p

print(get_t_and_p((SIDES,) * 4)[0])

1
คุณพลาดจำนวนม้วนสูงสุดที่คาดไว้ในเกมที่เป็นอิสระสี่เกม
ความน่าจะเป็นที่เป็นไปได้

อาฉันเพิ่งสังเกตเห็นว่า ฉันคิดว่าคุณหมายถึงขั้นต่ำ แต่ใช่
Neil G

@ NeilG: ฉันหมายถึงสูงสุดจริง ๆ (ดูคำถามที่อัปเดตของฉัน) แต่ฉันคิดว่ากลยุทธ์เหมือนกันสำหรับ min และ max คุณช่วยอธิบายเกี่ยวกับกลยุทธ์การเขียนโปรแกรมแบบไดนามิกได้ไหม?
Jonas

@Jonas: อัปเดตสูงสุดแล้ว ฉันมีงานจำนวนมาก แต่ฉันสามารถเขียนโค้ดนี้ให้คุณได้ในภายหลัง
Neil G

2
@ NeilG: ขอบคุณ ฉันหวังว่าจะได้รับวิธีการวิเคราะห์อย่างสมบูรณ์ แต่รหัส DP ก็เป็นคำแนะนำที่ดีเช่นกัน
Jonas

6

Monte Carlo ที่รวดเร็วและสกปรกประมาณค่า R ของความยาวของเกมสำหรับผู้เล่น 1 คน:

N = 1e5
sample_length = function(n) { # random game length
    x = numeric(0)
    while(length(unique(x)) < n) x[length(x)+1] = sample(1:n,1)
    return(length(x))
}
game_lengths = replicate(N, sample_length(6))

ผล: ,ดังนั้นช่วงความเชื่อมั่น 95% สำหรับค่าเฉลี่ยเป็น[14.645,14.722]μ^=14.684σ^=6.24[14.645,14.722]

ในการกำหนดความยาวของเกมที่มีผู้เล่นสี่คนเราสามารถจัดกลุ่มตัวอย่างเป็นสี่และใช้ความยาวขั้นต่ำเฉลี่ยของแต่ละกลุ่ม (คุณถามถึงจำนวนสูงสุด แต่ฉันคิดว่าคุณหมายถึงจำนวนขั้นต่ำตั้งแต่วิธีที่ฉันอ่าน เกมจะจบลงเมื่อมีคนประสบความสำเร็จในการหาตัวเลขทั้งหมด):

grouped_lengths = matrix(game_lengths, ncol=4)
min_lengths = apply(grouped_lengths, 1, min)

ผล: ,ดังนั้นช่วงความเชื่อมั่น 95% สำหรับค่าเฉลี่ยเป็น[9.411,9.468]μ^=9.44σ^=2.26[9.411,9.468]


1
ฉันมาถึงผลลัพธ์ที่คล้ายกันมากกับการจำลอง Matlab แต่ฉันอยากรู้ว่าฉันจะแก้ปัญหานี้อย่างไร นอกจากนี้เนื่องจากฉันเล่นกับลูก ๆ ของฉันพวกเขาทุกคนต้องการจบเกมโดยไม่คำนึงว่าใครจะชนะดังนั้นฉันจึงต้องการถามถึงจำนวนสูงสุด
Jonas

5

วิธีการเกี่ยวกับความสัมพันธ์เวียนเกิดที่เกี่ยวกับส่วนที่เหลืออีกจำนวนด้านคุณมีเพื่อให้ได้เพื่อที่จะชนะm

T1=6
Tm=1+6m6Tm+m6Tm1

โดยพื้นฐานแล้วความสัมพันธ์ล่าสุดบอกว่าจำนวนเวลาในการหมุนจำนวนที่เหลืออยู่จะเท่ากับบวก:1m1

  • 6 - m 6 - mTmถ้าคุณหมุนหมายเลขหนึ่งในหมุนไปแล้ว (ความน่าจะเป็น )6m6m6
  • m mTm1ถ้าคุณหมุนหนึ่งในจำนวนที่เหลือ (ความน่าจะเป็น )mm6

การประยุกต์ใช้ตัวเลขของความสัมพันธ์นี้จะช่วยให้14.714.7


มีบางอย่างผิดปกติกับคำตอบนี้ ไม่ควรที่จะเป็นตอนจบ 1} Ti=Ti1+66i+1
Neil G

1
ใช่ขอโทษที่ทำผิดฉันกำลังแก้ไขมัน
ThePawn

ฉันหวังว่าคุณจะไม่รังเกียจที่ฉันได้เพิ่มคำตอบ 14.7 ถูกต้อง แต่ความสัมพันธ์ที่เกิดซ้ำยังคงมีข้อบกพร่อง…
Neil G

ไม่มีปัญหาควรระวังครั้งแรก :) คำตอบของคุณดีมาก
ThePawn

5

คำอธิบายที่ใช้งานง่ายสำหรับคำถามแรก:

คุณต้องหมุนหมายเลขใด ๆ ก่อน ง่ายมากมันจะใช้เวลา 1 ม้วนเสมอ

จากนั้นคุณจะต้องหมุนหมายเลขอื่นที่ไม่ใช่หมายเลขแรก โอกาสที่จะเกิดเหตุการณ์นี้คือดังนั้นมันจะใช้ค่าเฉลี่ย (1.2) 65665

จากนั้นคุณต้องหมุนหมายเลขใด ๆ นอกเหนือจากสองตัวแรก โอกาสที่จะเกิดเหตุการณ์นี้คือดังนั้นมันจะใช้ค่าเฉลี่ย (1.5) 64664

จากนั้นคุณจะต้องหมุนหมายเลขใด ๆ นอกเหนือจากสามตัวแรก โอกาสที่จะเกิดเหตุการณ์นี้คือดังนั้นมันจะใช้เวลาโดยเฉลี่ย (2) (2) 63663

และจนกว่าเราจะเสร็จสิ้นการม้วนที่ 6 ของเราสำเร็จ:

66+65+64+63+62+61=14.7 rolls

คำตอบนี้คล้ายกับคำตอบของ Neil G เท่านั้นโดยไม่มีเชนมาร์คอฟ


1

ฟังก์ชันความหนาแน่นของความน่าจะเป็น (หรือเทียบเท่าโดยสิ้นเชิง) สำหรับการรับหมายเลขใหม่ถัดไปคือ:

f = sum (p * (1 - p) ^ (i - 1), i = 1 .. inf)

โดยที่ p คือความน่าจะเป็นต่อม้วน 1 เมื่อไม่มีการหมุนหมายเลข 5/6 หลัง 1, 4/6 .. ลดลงเหลือ 1/6 สำหรับตัวเลขสุดท้าย

ค่าที่คาดหวัง mu = ผลรวม (i * p * (1 - p) ^ (i - 1), i = 1 .. inf) ให้ n = i - 1 และนำ p นอกการรวม

mu = p * sum ((n + 1) * (1 - p) ^ n, n = 0 .. inf)

mu = p * sum (n (1-p) ^ n, n = 0 .. inf) + p * sum ((1-p) ^ n, n = 0 .. inf) mu = p * (1-p ) / (1-p-1) ^ 2 + p * 1 / (1- (1-p))

mu = p * (1 - p) / p ^ 2 + p / p

mu = (1 - p) / p + p / p

mu = (1 - p + p) / p

mu = 1 / p

ผลรวมของค่าที่คาดหวัง (mus) สำหรับ ps ของ 1, 5/6, 4/6, 3/6, 2/6 และ 1/6 คือ 14.7 ตามที่รายงานไว้ก่อนหน้านี้ แต่ 1 / p ต่อจำนวนที่ต้องการนั้นเป็นเรื่องทั่วไป ของขนาดตาย

ในทำนองเดียวกันเราสามารถคำนวณค่าเบี่ยงเบนมาตรฐานการวิเคราะห์

sigma ^ 2 = ผลรวม ((i - mu) ^ 2 * p * (1 - p) ^ (i - 1), i = 1 .. inf)

ฉันจะเก็บพีชคณิตให้คุณที่นี่ แต่ sigma ^ 2 = (1-p) / p ^ 2

ในกรณีที่ 6 ผลรวมของ sigma ^ 2 สำหรับแต่ละขั้นตอนคือ 38.99 สำหรับค่าเบี่ยงเบนมาตรฐานประมาณ 6.24 อีกครั้งตามที่จำลอง


-4

คำถามที่ 1 คือ:

คุณต้องทอยลูกเต๋าหกด้านกี่ครั้งจนกว่าคุณจะได้รับทุกหมายเลขอย่างน้อยหนึ่งครั้ง

เห็นได้ชัดว่าคำตอบที่ถูกต้องจะต้อง 'ไม่มีที่สิ้นสุด'


6
ที่จะตอบคำถาม 'เพื่อรับประกันด้วยความมั่นใจแน่นอนที่จะได้รับทุกหมายเลขอย่างน้อยหนึ่งครั้ง' สำหรับคำถามที่ถูกถามคำตอบคือตัวแปรสุ่มการแจกแจงซึ่งสามารถประมาณได้ดี
Glen_b
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.