Pólya urn พลิกและหมุน


13

คำชี้แจงปัญหา

Pólyaกำลังเล่นกับโกศของเขาอีกครั้งและเขาต้องการให้คุณช่วยเขาคำนวณความน่าจะเป็นบางอย่าง

ในการทดลองโกศนี้Pólyaมีโกศซึ่งเริ่มแรกประกอบด้วย 1 เม็ดสีแดงและสีฟ้า 1 เม็ด

สำหรับการวนซ้ำทุกครั้งที่เขาไปถึงและดึงลูกปัดจากนั้นตรวจสอบสีและวางลูกปัดกลับเข้าไปในโกศ

จากนั้นเขาก็โยนเหรียญที่ยุติธรรมถ้าหัวเหรียญเขาจะใส่เม็ดม้วนสีเดียวกันจำนวน 6 เม็ดลงในโกศหากมันตกลงไปเขาจะลบเม็ดสีเดียวกันออกจากโกศครึ่งหนึ่ง ( การใช้การหารจำนวนเต็ม - ดังนั้นถ้าจำนวนเม็ดของสีที่เลือกเป็นเลขคี่จะลบออก(c-1)/2โดยที่ c คือจำนวนเม็ดสีที่เลือก)

รับจำนวนเต็ม n ≥ 0 และทศนิยม r> 0 ให้ความน่าจะเป็นกับทศนิยม 2 ตำแหน่งที่อัตราส่วนระหว่างสีของเม็ดบีดหลังจากการวนซ้ำ n มากกว่าหรือเท่ากับ r ในจำนวนไบต์ที่สั้นที่สุด

ตัวอย่างชุดของการวนซ้ำ:

ปล่อยให้ (x, y) กำหนดโกศเช่นนั้นมันมี x เม็ดสีแดงและลูกปัดสีฟ้า y

Iteration    Urn       Ratio
0            (1,1)     1
1            (5,1)     5        //Red bead retrieved, coin flip heads, die roll 4
2            (5,1)     5        //Blue bead retrieved, coin flip tails
3            (3,1)     3        //Red bead retrieved, coin flip tails
4            (3,4)     1.333... //Blue bead retrieved, coin flip heads, die roll 3

ดังที่เห็นได้ว่าอัตราส่วน r คือ≥ 1 เสมอ (ดังนั้นมันจึงยิ่งแดงหรือน้ำเงินหารด้วยเลสเบี้ยน)

กรณีทดสอบ:

ให้ F (n, r) กำหนดแอปพลิเคชันของฟังก์ชันสำหรับการวนซ้ำและอัตราส่วนของ r

F(0,5) = 0.00
F(1,2) = 0.50
F(1,3) = 0.42
F(5,5) = 0.28
F(10,4) = 0.31
F(40,6.25) = 0.14

นี่คือรหัสกอล์ฟดังนั้นทางออกที่สั้นที่สุดในหน่วยไบต์ชนะ


ฉันรู้สึกเหมือนมีสูตรสำหรับสิ่งนี้ ...
ศูนย์รวมของความไม่รู้

อาจมีบางอย่างที่เกี่ยวข้องกับเบต้าทวินาม แต่อาจจะนานกว่านั้นในการเขียนออกมา
ข้อมูลหมดอายุ

ขึ้นอยู่กับภาษา R และ Mathematica อาจทำได้อย่างมีประสิทธิภาพ
Giuseppe

คำตอบ:


6

JavaScript (ES7),  145 ... 129 124  123 ไบต์

(r)(n)จะเข้าเป็น นี่เป็นโซลูชั่นไร้เดียงสาที่ดำเนินการจำลองทั้งหมด

r=>g=(n,B=s=0,R=0,h=d=>++d<7?h(d,[0,d].map(b=>g(n,B/-~!!b,R/-~!b)&g(n,B+b,R+d-b))):s/24**-~n)=>n--?h``:s+=~B<=r*~R|~R<=r*~B

ลองออนไลน์!

ช้าเกินไปสำหรับกรณีทดสอบ 2 ครั้งล่าสุด

แสดงความคิดเห็น

r =>                    // r = target ratio
g = (                   // g is a recursive function taking:
  n,                    //   n = number of iterations
  B =                   //   B = number of blue beads, minus 1
  s = 0,                //   s = number of times the target ratio was reached
  R = 0,                //   R = number of red beads, minus 1
  h = d =>              //   h = recursive function taking d = 6-sided die value
    ++d < 7 ?           // increment d; if d is less than or equal to 6:
      h(                //   do a recursive call to h:
        d,              //     using the new value of d
        [0, d].map(b => //     for b = 0 and b = d:
          g(            //       do a first recursive call to g:
            n,          //         leave n unchanged
            B / -~!!b,  //         divide B by 2 if b is not equal to 0
            R / -~!b    //         divide R by 2 if b is equal to 0
          ) & g(        //       do a second recursive call to g:
            n,          //         leave n unchanged
            B + b,      //         add b blue beads
            R + d - b   //         add d - b red beads
          )             //       end of recursive calls to g
        )               //     end of map()
      )                 //   end of recursive call to h
    :                   // else (d > 6):
      s / 24 ** -~n     //   stop recursion and return s / (24 ** (n + 1))
) =>                    // body of g:
  n-- ?                 //   decrement n; if n was not equal to 0:
    h``                 //     invoke h with d = [''] (coerced to 0)
  :                     //   else:
    s +=                //     increment s if:
      ~B <= r * ~R |    //       either (-B-1) <= r*(-R-1), i.e. (B+1)/(R+1) >= r
      ~R <= r * ~B      //       or     (-R-1) <= r*(-B-1), i.e. (R+1)/(B+1) >= r

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

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