ความน่าจะเป็นของการวาดคำที่กำหนดจากถุงตัวอักษรใน Scrabble


18

สมมติว่าคุณมีถุงที่มีกระเบื้องแต่ละคนมีตัวอักษรบนมัน มีมีตัวอักษร 'A',พร้อมด้วย 'B' และอื่น ๆ และ 'ไวด์การ์ด' (เรามี ) สมมติว่าคุณมีพจนานุกรมที่มีจำนวนคำ จำกัดnnAnBnn=nA+nB++nZ+n

คุณเลือกไพ่จากกระเป๋าโดยไม่มีการเปลี่ยนk

คุณจะคำนวณ (หรือประมาณ) ความน่าจะเป็นที่คุณสามารถจัดรูปแบบของคำที่กำหนดความยาว (ด้วย 1 < l = < k ) จากพจนานุกรมที่ให้การเรียงตัวkได้อย่างไรllkk

สำหรับผู้ที่ไม่คุ้นเคยกับ Scrabble (TM) สามารถใช้อักขระตัวแทนเพื่อจับคู่กับตัวอักษรใดก็ได้ ดังนั้นคำว่า 'BOOT' อาจเป็น 'สะกด' ด้วย 'B', '*', 'O', 'T' ลำดับที่ตัวอักษรถูกวาดไม่สำคัญ

คำแนะนำ: เพื่อให้การเขียนคำตอบง่ายขึ้นอาจเป็นการดีกว่าที่จะตอบคำถาม: ความน่าจะเป็นที่จะมีคำว่า 'BOOT' อยู่ระหว่างการเคลื่อนไหวที่เป็นไปได้หลังจากวาดตัวอักษร 7 ตัวจากถุงสด

(ปัญหาเบื้องต้นได้ถูกคัดลอกมาจากคำถามที่คล้ายกันนี้)


ฉันแนะนำให้จัดการกรณีที่ง่ายกว่าก่อนเช่นกรณีที่ไม่มีสัญลักษณ์แทน
Glen_b -Reinstate Monica

@Glen_b ฉันเห็นด้วย เนื่องจากจุดประสงค์สุดท้ายของฉันคือการจัดเรียงคำตามความน่าจะเป็นฉันจึงคิดว่าการละเว้นสัญลักษณ์ตัวแทนเป็นการประมาณที่ยอมรับได้ อย่างไรก็ตามฉันยังไม่มีทักษะในการสร้างสูตรเพื่อแก้ปัญหาที่ง่ายกว่านี้
Sébastien

1
หากคุณต้องการเริ่มง่ายขึ้นให้คำนวณความน่าจะเป็นในการเลือก 'B' แล้วตามด้วย 'O' แล้วตามด้วย 'O' จากนั้น 'T' หลังจากนั้นให้คำนวณความน่าจะเป็นในการเลือกตัวอักษรในลำดับใดก็ได้ หลังจากนั้นให้พิจารณาปัจจัยที่คุณมีอยู่เจ็ดครั้ง จากนั้นให้คำนึงถึงปัจจัยภายใน
Jerry Schirmer

1
วิธีง่าย ๆ ในการแก้ไขปัญหานี้คือใช้การประมาณ Monte Carlo จะเพียงพอหรือไม่
Rasmus Bååth

1
คุณกำลังพูดถึงการสร้างคำด้วยตัวอักษรที่คุณเลือกหรือคำนึงถึงตัวอักษรที่เลือกไปแล้วและคำที่วางไว้บนกระดานอยู่แล้ว?
samthebrand

คำตอบ:


12

สูตรที่มีการร้องขอ แต่น่าเสียดายที่สถานการณ์มีความซับซ้อนมากจนดูเหมือนว่าสูตรใด ๆ จะเป็นเพียงวงเวียนในการแจกแจงความเป็นไปได้ทั้งหมด แต่คำตอบนี้นำเสนออัลกอริทึมซึ่งเป็น (a) tantamount สำหรับสูตรที่เกี่ยวข้องกับผลรวมของผลิตภัณฑ์ของสัมประสิทธิ์ทวินามและ (b) สามารถนำไปใช้กับหลายแพลตฟอร์มได้


เพื่อให้ได้สูตรดังกล่าวแบ่งความเป็นไปได้ออกเป็นกลุ่มที่แยกจากกันในสองวิธี: ตามจำนวนตัวอักษรที่ไม่ได้อยู่ในคำที่ถูกเลือกในชั้นวาง (ให้เป็นm ) และตามจำนวน wildcard (ช่องว่าง) ที่เลือก ( ปล่อยให้มันเป็นw ) เมื่อมีไพ่r=7ในชั้นวางไพ่ที่มีอยู่Nแผ่นMมีตัวอักษรไม่อยู่ในคำและมีช่องว่างW=2จำนวนตัวเลือกที่เป็นไปได้ที่กำหนดโดย(m,w)คือ

(Mm)(Ww)(NMWrmw)

เพราะทางเลือกของตัวอักษรที่ไม่ใช่คำช่องว่างและตัวอักษรคำว่าเงื่อนไขเป็นอิสระเกี่ยวกับ(m,w,r).

ซึ่งจะช่วยลดปัญหาในการหาจำนวนวิธีที่จะสะกดคำเมื่อมีการเลือกเฉพาะจากกระเบื้องที่เป็นตัวแทนของตัวอักษรของคำที่ กำหนดว่าwช่องว่างที่มีอยู่และrmwกระเบื้องจะถูกเลือก สถานการณ์ยุ่งเหยิงและไม่มีสูตรปิดให้บริการ ตัวอย่างเช่นเมื่อw=0ว่างและm=3ตัวอักษรที่ไม่อยู่ในคำนั้นจะมีตัวอักษรเหลืออยู่สี่ตัวที่จะสะกด "boot" ที่ถูกดึงมาจากไทล์ "b", "o" และ "t" . เนื่องจากมี2 "b" คือ8 "o" และ6"t" ในชุดไพ่ Scrabble มีความน่าจะเป็นในเชิงบวกของการวาด (หลายชุด) "bboo", "bbot", "bbtt", "booo", "บูต", "ขวด", "bttt", "oooo" "," ooot "," oott "," ottt "และ" tttt "แต่มีเพียงหนึ่งในคาถา" บูต "เหล่านี้ และนั่นเป็นกรณีที่ง่าย! ตัวอย่างเช่นสมมติว่าชั้นวางมีห้าแผ่นที่เลือกแบบสุ่มจากแผ่น "o", "b" และ "t" พร้อมด้วยช่องว่างทั้งสองมีหลายวิธีในการสะกด "บูต" - และไม่ต้องสะกด ตัวอย่างเช่น "boot" สามารถสะกดได้จาก "__boott" และ "__bbttt" แต่ไม่ใช่จาก "__ttttt"

การนับนี้ - หัวใจของปัญหา - สามารถจัดการซ้ำได้ ฉันจะอธิบายด้วยตัวอย่าง สมมติว่าเราต้องการนับวิธีการสะกดคำว่า "บูต" ด้วยหนึ่งช่องว่างและอีกสี่แผ่นจากการรวบรวมแผ่น "b", "o" และ "t" (ที่เหลืออีกสองแผ่นแสดงตัวอักษรที่ไม่ใช่ช่องว่างที่ไม่ใช่ใน { "b", "o", "t"}) พิจารณาตัวอักษรตัวแรก "b":

  1. สามารถวาด "b" ใน(21)วิธีจากแผ่น "b" สองรายการที่มีอยู่ สิ่งนี้จะช่วยลดปัญหาในการนับจำนวนวิธีสะกดคำต่อท้าย "oot" โดยใช้ช่องว่างและอีกสามแผ่นจากการรวบรวมไทล์ "o" และ "t"

  2. หนึ่งช่องว่างสามารถกำหนดเป็น "b" สิ่งนี้จะช่วยลดปัญหาในการนับจำนวนวิธีการสะกด "oot" โดยใช้ช่องว่างที่เหลือและเพียงสามแผ่นจากคอลเล็กชันของแผ่น "o" และ "t"

โดยทั่วไปขั้นตอน (1) และ (2) - ซึ่งแยกจากกันและดังนั้นจึงมีส่วนเพิ่มในการคำนวณความน่าจะเป็น - สามารถนำมาใช้เป็นวนรอบจำนวนช่องว่างที่อาจเป็นไปได้สำหรับตัวอักษรตัวแรก ปัญหาที่ลดลงได้รับการแก้ไขซ้ำแล้วซ้ำอีก กรณีฐานเกิดขึ้นเมื่อมีตัวอักษรหนึ่งตัวเหลืออยู่มีจำนวนไพ่ที่มีตัวอักษรนั้นอยู่จำนวนหนึ่งและอาจมีช่องว่างในชั้นวางด้วยเช่นกัน เราต้องตรวจสอบให้แน่ใจว่าจำนวนช่องว่างในชั้นวางรวมถึงจำนวนช่องว่างที่มีจะเพียงพอที่จะได้รับปริมาณที่ต้องการของตัวอักษรตัวสุดท้าย

นี่คือRรหัสสำหรับขั้นตอนแบบเรียกซ้ำ rackมักจะเท่ากับ , เป็นอาร์เรย์ของการนับของตัวอักษร (เช่น) เป็นโครงสร้างที่คล้ายกันให้หมายเลขของกระเบื้องที่มีอยู่กับตัวอักษรเหล่านั้นและคือจำนวนของช่องว่างสันนิษฐานว่าจะเกิดขึ้นในชั้น7wordc(b=1, o=2, t=1)alphabetwild

f <- function(rack, word, alphabet, wild) {
  if (length(word) == 1) {
    return(ifelse(word > rack+wild, 0, choose(alphabet, rack)))
  }
  n <- word[1]
  if (n <= 0) return(0)
  m <- alphabet[1]
  x <- sapply(max(0, n-wild):min(m, rack), 
              function(i) {
                choose(m, i) * f(rack-i, word[-1], alphabet[-1], wild-max(0, n-i))
              })
  return(sum(x))
}

อินเตอร์เฟซที่ฟังก์ชั่นนี้ระบุกระเบื้องข่วนมาตรฐานแปลงคำที่กำหนดในโครงสร้างข้อมูล MultiSet และดำเนินการรวมสองครั้งกว่าและกว้าง นี่เป็นที่ที่ค่าสัมประสิทธิ์ทวินาม( Mmwและ ( W(Mm)คำนวณและคูณ(Ww)

scrabble <- function(sword, n.wild=2, rack=7, 
              alphabet=c(a=9,b=2,c=2,d=4,e=12,f=2,g=3,h=2,i=9,j=1,k=1,l=4,m=2,
                         n=6,o=8,p=2,q=1,r=6,s=4,t=6,u=4,v=2,w=2,x=1,y=2,z=1),
              N=sum(alphabet)+n.wild) {
  word = sort(table(strsplit(sword, NULL))) # Sorting speeds things a little
  a <- sapply(names(word), function(s) alphabet[s])
  names(a) <- names(word)
  x <- sapply(0:n.wild, function(w) {
    sapply(sum(word):rack-w, 
           function(i) {
             f(i, word, a, wild=w) *
               choose(n.wild, w) * choose(N-n.wild-sum(a), rack-w-i)
           })
  })
  return(list(numerator = sum(x), denominator = choose(N, rack),
              value=sum(x) / choose(N, rack)))
}

ลองใช้วิธีแก้ปัญหานี้และเวลาที่เราไป การทดสอบต่อไปนี้ใช้อินพุตเดียวกันกับที่ใช้ในการจำลองโดย @Rasmus Bååth :

system.time(x <- sapply(c("boot", "red", "axe", "zoology"), scrabble))

เครื่องนี้รายงานเวลาที่ผ่านไปทั้งหมดวินาที: รวดเร็วพอสมควร ผลลัพธ์หรือไม่0.05

> x
            boot        red         axe         zoology     
numerator   114327888   1249373480  823897928   11840       
denominator 16007560800 16007560800 16007560800 16007560800 
value       0.007142118 0.07804896  0.0514693   7.396505e-07

ความน่าจะเป็นสำหรับ "บูต" ของตรงเท่ากับค่า2381831 / 333490850ได้รับในคำตอบอื่น ๆ ของฉัน (ซึ่งใช้วิธีการคล้ายกัน แต่เตียงนอนมันอยู่ในกรอบที่กำหนดให้มีประสิทธิภาพมากขึ้นพีชคณิตสัญลักษณ์แพลตฟอร์มคอมพิวเตอร์) ความน่าจะเป็นสำหรับทุกสี่คำจะได้อยู่ใกล้จำลอง Baath (ซึ่งไม่สามารถคาดหวังว่าจะให้ค่าที่ถูกต้องสำหรับ "สัตววิทยา" เนื่องจากความน่าจะเป็นที่ต่ำของ11840 / 16007560800 ,ซึ่งน้อยกว่าหนึ่งในล้าน)114327888/160075608002381831/33349085011840/16007560800,


ทางออกที่ดีและสง่างาม! และเร็วกว่าของฉันมาก ... :)
Rasmus Bååth

1
นี่คือคำตอบที่ดีขอบคุณ ฉันจะมีช่วงเวลาที่ยากในการเขียนโค้ดอัลกอริทึมของคุณดังนั้นโค้ดที่พร้อมใช้งานก็ยินดีต้อนรับอย่างมาก ฉันไม่รู้Rแต่ยังสามารถใช้ฟังก์ชั่นของคุณในเวลาน้อยกว่าหนึ่งชั่วโมงเพื่อให้สคริปต์รับอินพุตจากไฟล์พจนานุกรมคำขนาด 20k และเขียนผลลัพธ์ไปยัง. csv (ใช้เวลาน้อยกว่า 10 นาทีสำหรับแกนกลางระดับ i5)
Sébastien

16

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

แบบจำลอง (แสดงที่ส่วนท้าย) สนับสนุนคำตอบที่คำนวณ


รายละเอียด

เช่นเดียวกับในคำตอบก่อนหน้านี้Mathematicaใช้ในการคำนวณ

  1. ระบุปัญหา:คำ (หรือคำหากคุณต้องการ) ตัวอักษรการนับและขนาดชั้นวาง เนื่องจากตัวอักษรทั้งหมดที่ไม่ได้อยู่ในคำนั้นทำแบบเดียวกันมันจึงเร่งความเร็วในการคำนวณเพื่อแทนที่พวกมันทั้งหมดด้วยสัญลักษณ์เดียวแทน "ตัวอักษรใด ๆ ที่ไม่ได้อยู่ในคำว่า"χ

    word = {b, o, o, t};
    letters = {b, o, t, \[Chi], \[Psi]};
    tileCounts = {2, 8, 6, 82, 2};
    rack = 7;
  2. สร้างพจนานุกรมของคำนี้ (หรือคำ) และเพิ่มเพื่อรวมการสะกดทั้งหมดที่เป็นไปได้

    dict[words_, nWild_Integer] := Module[{wildcard, w},
       wildcard = {xx___, _, yy___} -> {xx, \[Psi], yy};
       w = Nest[Flatten[ReplaceList[#, wildcard] & /@ #, 1] &, words, nWild];
       Union[Times @@@ Join[w, Times @@@ words]]];
    dictionary = dict[{word}, 2]

    {bo2t,bo2ψ,botψ,o2tψ,boψ2,o2ψ2,btψ2,otψ2}

  3. คำนวณ nonwords:

    alphabet = Plus @@ letters;
    nonwords = Nest[PolynomialMod[# alphabet, dictionary] &, 1, rack]

    b7+7b6o+21b5o2++7χψ6+ψ7

    (มีคำที่ไม่ใช่คำในกรณีนี้)185

  4. คำนวณโอกาส สำหรับการสุ่มตัวอย่างด้วยการแทนที่เพียงแทนที่ไทล์นับสำหรับตัวแปร:

    chances = (Transpose[{letters, tileCounts/(Plus @@ tileCounts)}] /. {a_, b_} -> a -> b);
    q = nonwords /. chances;
    1 - q

    20726341339062500000

    ค่านี้ประมาณ0.00756036.

    สำหรับการสุ่มตัวอย่างโดยไม่มีการแทนที่ให้ใช้อำนาจแบบมีอำนาจแทนพลัง:

    multiplicities = MapThread[Rule, {letters, tileCounts}];
    chance[m_] :=  (ReplaceRepeated[m , Power[xx_, n_] -> FactorialPower[xx, n]] 
                   /. multiplicities);
    histor = chance /@ MonomialList[nonwords];
    q0 = Plus @@ histor  / FactorialPower[Total[tiles], nn];
    1 - q0

    2381831333490850

    ค่านี้ประมาณ การคำนวณได้ทันทีจริง0.00714212.


ผลการจำลอง

ผลการค้นหาซ้ำพร้อมการแทนที่:106

simulation = RandomChoice[tiles -> letters, {10^6, 7}];
u = Tally[Times @@@ simulation];
(p = Total[Cases[Join[{PolynomialMod[u[[All, 1]], dictionary]}\[Transpose], 
       u, 2], {0, _, a_} :> a]] / Length[simulation] ) // N

0.007438

เปรียบเทียบกับค่าที่คำนวณเทียบกับข้อผิดพลาดมาตรฐาน:

(p - (1 - q)) / Sqrt[q (1 - q) / Length[simulation]] // N

1.41259

ข้อตกลงเป็นไปอย่างดีสนับสนุนผลการคำนวณอย่างยิ่ง

ผลการค้นหาซ้ำโดยไม่ต้องเปลี่ยน:106

tilesAll = Flatten[MapThread[ConstantArray[#1, #2] &, {letters, tiles}] ]
    (p - (1 - q)) / Sqrt[q (1 - q) / Length[simulation]] // N;
simulation = Table[RandomSample[tilesAll, 7], {i, 1, 10^6}];
u = Tally[Times @@@ simulation];
(p0 = Total[Cases[Join[{PolynomialMod[u[[All, 1]], dictionary]}\[Transpose], 
       u, 2], {0, _, a_} :> a]] / Length[simulation] ) // N

0.00717

ทำการเปรียบเทียบ:

(p0 - (1 - q0)) / Sqrt[q0 (1 - q0) / Length[simulation]] // N

0.331106

ข้อตกลงในการจำลองนี้ยอดเยี่ยม

เวลาทั้งหมดในการจำลองคือวินาที12


13

นี่คือวิธีการแก้ปัญหาของมอนติคาร์โลนั่นคือเรากำลังจำลองการวาดแผ่นกระเบื้องเป็นล้านล้านครั้งแล้วเราจะคำนวณจำนวนการจับที่จำลองขึ้นเหล่านี้ส่งผลให้เราสามารถสร้างคำที่กำหนดได้ ฉันได้เขียนวิธีแก้ปัญหาใน R แต่คุณสามารถใช้ภาษาการเขียนโปรแกรมอื่น ๆ เช่น Python หรือ Ruby

ก่อนอื่นฉันจะอธิบายวิธีการจำลองการวาดหนึ่งครั้ง ก่อนอื่นเรามากำหนดความถี่ของไพ่

# The tile frequency used in English Scrabble, using "_" for blank.
tile_freq <- c(2, 9 ,2 ,2 ,4 ,12,2 ,3 ,2 ,9 ,1 ,1 ,4 ,2 ,6 ,8 ,2 ,1 ,6 ,4 ,6 ,4 ,2 ,2 ,1 ,2 ,1)
tile_names <- as.factor(c("_", letters))
tiles <- rep(tile_names, tile_freq)
## [1] _ _ a a a a a a a a a b b c c d d d d e e e e e e
## [26] e e e e e e f f g g g h h i i i i i i i i i j k l
## [51] l l l m m n n n n n n o o o o o o o o p p q r r r
## [76] r r r s s s s t t t t t t u u u u v v w w x y y z
## 27 Levels: _ a b c d e f g h i j k l m n o p q r ... z

จากนั้นเข้ารหัสคำเป็นเวกเตอร์ของตัวอักษรที่มีความสำคัญ

word <- "boot"
# A vector of the counts of the letters in the word
word_vector <- table( factor(strsplit(word, "")[[1]], levels=tile_names))
## _ a b c d e f g h i j k l m n o p q r s t u v w x y z 
## 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 1 0 0 0 0 0 0 

ตอนนี้วาดตัวอย่างของไพ่เจ็ดใบแล้วเข้ารหัสในแบบเดียวกับคำว่า

tile_sample <- table(sample(tiles, size=7))
## _ a b c d e f g h i j k l m n o p q r s t u v w x y z 
## 1 0 0 0 0 1 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 1 0 0 0 

ในที่สุดคำนวณตัวอักษรที่หายไป ...

missing <- word_vector - tile_sample
missing <- ifelse(missing < 0, 0, missing)
## _ a b c d e f g h i j k l m n o p q r s t u v w x y z 
## 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 

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

sum(missing) - tile_sample["blank"] <= 0
## FALSE

ในกรณีพิเศษนี้เราไม่ได้ทำ ... ตอนนี้เราต้องทำซ้ำหลาย ๆ ครั้งและคำนวณเปอร์เซ็นต์ของการจับรางวัลที่สำเร็จ ทั้งหมดนี้ทำโดยฟังก์ชัน R ต่อไปนี้:

word_prob <- function(word, reps = 50000) {
  tile_freq <- c(2, 9 ,2 ,2 ,4 ,12,2 ,3 ,2 ,9 ,1 ,1 ,4 ,2 ,6 ,8 ,2 ,1 ,6 ,4 ,6 ,4 ,2 ,2 ,1 ,2 ,1)
  tile_names <- as.factor(c("_", letters))
  tiles <- rep(tile_names, tile_freq)
  word_vector <- table( factor(strsplit(word, "")[[1]], levels=tile_names))
  successful_draws <- replicate(reps, {
    tile_sample <- table(sample(tiles, size=7))
    missing <- word_vector - tile_sample
    missing <- ifelse(missing < 0, 0, missing)
    sum(missing) - tile_sample["_"] <= 0
  })
  mean(successful_draws)
}

นี่repsคือจำนวนการสุ่มจับ ตอนนี้เราสามารถลองใช้คำต่าง ๆ กัน

> word_prob("boot")
[1] 0.0072
> word_prob("red")
[1] 0.07716
> word_prob("axe")
[1] 0.05088
> word_prob("zoology")
[1] 2e-05

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

2
ฉันเชื่อว่าsampleมันไม่ได้ทำตามที่คุณคาดหวัง ตัวอย่างเช่นจะเกิดอะไรขึ้นกับรหัสของคุณหากเกมได้รับการแก้ไขเพื่อให้วางได้ 28 ไทล์ เปลี่ยนsize=7เป็นsize=28ค้นหา
whuber

2
@whuber คุณถูกต้องขอบคุณที่ชี้ให้เห็น! ตอนนี้มันใช้งานได้และให้ผลลัพธ์เป็นคำตอบเดียวกับรหัสของคุณ!
Rasmus Bååth

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

7

p0=(nb1)(no2)(nt1)(n43)(n7)
pkk
p0=(nb1)(no2)(nt1)(n43)(n7)p1=p0+(n1)(no2)(nt1)(n43)(n7)+(nb1)(no1)(n1)(nt1)(n43)(n7)+(nb1)(no2)(n1)(n43)(n7)=p0+(n1)(n43)(n7)((no2)(nt1)+(nb1)(no1)(nt1)+(nb1)(no2))p2=p1+(n2)(n43)(n7)((nb1)(no1)+(nb1)(nt1)+(no2)+(no1)(nt1))p3=p2+(n3)(n43)(n7)((nb1)+(no1)+(nt1))p4=p3+(n4)(n43)(n7)pi=p4,i4

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

1
There are mistakes in the calculation of p0: it assumes exactly 1 "b", 2 "o"s, and 1 "t" will be chosen; and then it assumes the choice of the other three letters will be independent of those choices, which it is not. Assuming n=100 คือจำนวนรวมของไพ่ค่าผลลัพธ์ที่ได้จะใหญ่กว่าที่ควรจะเป็น (เท่ากับ 8/25850.0031) ข้อผิดพลาดเดียวกันถูกถ่ายทอดไปสู่การคำนวณความน่าจะเป็นตัวแทน
whuber

-1

Meh

γ=0xล.n(x)ΣR=0(+Y-1)(+α)R(+β)R(+1)R(+γ)RxR+

+0xΣR=0(+γ-1)(+α)R(+β)R(+1)R(+γ)R(1+γ-1+

+Σk=0R-1(1+α+κ+1+β+κ+1+1+κ-1+γ+κ))xR

=0xΣR=0(+γ-1)(+α)R(+β)R(+1)R(+γ)R(ล.n x+1+γ-1+

+Σk=0R-1(1+α+κ+1+β+κ-1+1+κ-1+γ+κ))xR
.

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

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

ความน่าจะเป็นในการวาดคำที่กำหนดจากถุงตัวอักษรใน Scrabble นั้นต้องการจำนวนตัวอักษรที่มีอยู่ในถุงสำหรับแต่ละตัวอักษร (AZ) และไม่ว่าเราจะใช้ wild card เป็นส่วนเสริมในคณิตศาสตร์หรือไม่ แผ่นเปล่าจะรวมอยู่ในคณิตศาสตร์นี้ - สมมติว่ามี 100 แผ่นซึ่ง 2 แผ่นนั้นว่างเปล่า นอกจากนี้จำนวนกระเบื้องที่มีให้ใช้จะแตกต่างกันไปตามภาษาของเกมและกฎของเกมจากทั่วโลก คุ้ยเขี่ยภาษาอังกฤษแตกต่างจากหวัดคุ้ยเขี่ยแน่นอน เพียงแค่แก้ไขตัวอักษรที่มีอยู่และคณิตศาสตร์ควรทำงาน

หากใครพบข้อผิดพลาดฉันจะแน่ใจว่าได้อัปเดตและแก้ไขพวกเขา

Boot : น่าจะเป็นของการบูตในเกมหวัดเป็น 0.000386% ซึ่งเป็นโอกาสที่ 67 จาก 173,758 มือตามที่แสดงบนหน้าคำสำหรับบูต

กระเบื้องอังกฤษ

ทั้งหมดคืออาร์เรย์ของตัวอักษรในกระเป๋า นับเป็นอาร์เรย์ของกระเบื้องพร้อมใช้งานสำหรับตัวอักษรนั้นและจุดเป็นค่าที่จุดของตัวอักษร

// All arranged by letter, number of letters in scrabble game, and point for the letter.
$all = array("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z");
    $count = array("9", "2", "2", "4", "12", "2", "3", "2", "9", "1", "1", "4", "2", "6", "8", "2", "1", "6", "4", "6", "4", "2", "2", "1", "2", "1");
$point = array("1", "3", "3", "2", "1", "4", "2", "4", "1", "8", "5", "1", "3", "1", "1", "3", "10", "1", "1", "1", "1", "4", "4", "8", "4", "10");

มี100ไพ่ในเกมข่วนภาษาอังกฤษ (เช่นผลรวมของ$count) ไม่สำคัญว่าจะดึงกระเบื้องอย่างไรจึงไม่ใช่การเปลี่ยนแปลง

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

ตรวจสอบชุดค่าผสมทวินามที่มีอยู่

let C(n,r) be binomial coefficient: n!/[n!(n-r)!], or 0 if r > n

ตัวอักษรที่อยู่ตรงหน้าสัมประสิทธิ์ทวินามคืออะไร

มี 1 "B" มี 2 ​​มี 2% โอกาสในการดึง b
มี 2 ​​"O" มี 8 ที่มีอยู่โอกาส 8% ที่จะดึง o
มี 1 "T" มี 6 ตัวที่มีโอกาส 6% ในการดึงเสื้อ
BOOT เป็นคำที่ประกอบด้วยตัวอักษร 4 ตัวจากชุดตัวต่อ 100 ช่องที่มีช่องว่างโดยไม่มี

n = 98. จำนวนแผ่นที่ไม่มีช่องว่างในชุดภาษาอังกฤษ

B=(21)=2!2!(2-1)!
O=(82)=8!8!(8-2)!
T=(61)=6!6!(6-1)!

B×O×T หารด้วยสัมประสิทธิ์ทวินามของ tilecount 98!98!(98-ล.อีnก.เสื้อชั่วโมง)!


เป็นการยากที่จะประเมินโซลูชันของคุณโดยไม่รู้ตัว n และ Rอ้างถึงในสูตรสุดท้าย คุณจะจัดการกับเอฟเฟกต์ของช่องว่างได้อย่างไร นั่นคือสิ่งที่ทำให้ปัญหานี้เป็นเรื่องยาก โดยไม่คำนึงถึงมันจะน่าสนใจที่จะเห็นการสาธิตว่าค่าของ38248840160075608000.00239ไม่ถูกต้อง: สิ่งนี้ได้มาโดยใช้Rวิธีที่ฉันโพสต์ ลองทำRแบบจำลองนี้หนึ่งวินาที:let <- c(rep("b", 2), rep("o", 8), rep("t", 6), rep("_", 84)); boot <- function(x) sum(x=="b")>=1 && sum(x=="o")>=2 && sum(x=="t")>=1; mean(replicate(1e5, boot(sample(let, 7))))
whuber

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

หากการรวมกัน - คณิตศาสตร์เป็นสัมประสิทธิ์ทวินาม ดังนั้นขอให้ x เป็นจำนวนไพ่ที่ว่างเปล่า คณิตศาสตร์ที่เปลี่ยนแปลงเพียงอย่างเดียวคือ n! - มีช่องว่างที่ใช้หรือไม่ ถ้าเป็นเช่นนั้นให้เพิ่มจำนวนช่องว่างเป็น n! เนื่องจากช่องว่างอนุญาตให้มีตัวเลือกได้มากขึ้น 2 ตัวเลือก (n + x)! - ถ้าไม่ปล่อยให้ n! อย่างที่เป็น. ใช่? ไม่มี? หากไม่ได้ใช้ช่องว่างทั้งนี้ขึ้นอยู่กับกฎของภาษาในกรณีนี้ภาษาอังกฤษ n! = 98 หรือ 100 ด้วย ตัวอักษรแต่ละตัวที่ไม่มีช่องว่างคือ C (n, r) และอีกตัวที่มีช่องว่าง C ((n + x), r) ในอาเรย์นั้นมีที่ว่าง - แต่ฉันลืมใส่ค่าว่างไว้ในคณิตศาสตร์ ดังนั้นเพียงแค่เปลี่ยน n เพื่อทำงานกับช่องว่าง ใช่?
James Cordeiro

ไม่การให้เหตุผลของคุณไม่ถูกต้อง ฉันขอเชิญคุณลองใช้สูตรของคุณด้วยตัวเลขที่น้อยลงเพื่อให้คุณสามารถดูว่าพวกเขาไปไหนผิด
whuber

คุณหมายถึงอะไรโดยตัวเลขที่น้อยกว่า - whuber? ยกตัวอย่างให้ฉัน คุณกำลังพูดว่าการดึงการบูตจากชุดตัวอักษร 10 ตัวแทน 1 b, 2 o, 1 t's โดยมี 1 ช่องว่างในชุดและอีก 5 ตัวอักษร หรือสิ่งที่แตกต่างอย่างสิ้นเชิง ฉันไม่ใช่วิชาคณิตศาสตร์ แต่ดูเหมือนว่าเราจะเป็นผู้เล่นโป๊กเกอร์ ตอนนี้เรากำลังคำนวณอัตราต่อรองของโป๊กเกอร์ด้วยไพ่แบบหวัด ๆ ที่ไม่มีความเหมาะสม
James Cordeiro
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.