Kemungkinan menggambar kata yang diberikan dari kantong surat di Scrabble

18

Misalkan Anda memiliki tas dengan n ubin, masing-masing dengan huruf di atasnya. Ada nA ubin dengan huruf 'A', nB dengan 'B', dan seterusnya, dan n ubin wildcard '(kami memiliki ). Misalkan Anda memiliki kamus dengan jumlah kata yang terbatas.n=nA+nB++nZ+n

Anda memilih ubin dari kantong tanpa pengganti.k

Bagaimana Anda menghitung (atau memperkirakan) probabilitas bahwa Anda dapat membentuk kata tertentu, dengan panjang (dengan 1 < = < ) dari kamus mengingat ubin dipilih?l k kllkk

Bagi mereka yang tidak terbiasa dengan Scrabble (TM), karakter wildcard dapat digunakan untuk mencocokkan huruf apa pun. Jadi kata 'BOOT' bisa 'dieja' dengan ubin 'B', '*', 'O', 'T'. Urutan pengambilan surat tidak menjadi masalah.

Saran: untuk menyederhanakan penulisan jawaban, mungkin lebih baik hanya menjawab pertanyaan: berapa probabilitas memiliki kata 'BOOT' di antara kemungkinan perpindahan Anda setelah menggambar 7 huruf dari tas baru.

(pengantar masalah telah disalin dari pertanyaan serupa ini )

Sébastien
sumber
Saya akan menyarankan menangani kasus yang lebih sederhana terlebih dahulu, seperti yang tanpa wildcard.
Glen_b -Reinstate Monica
@ Glen_b saya setuju. Karena tujuan akhir saya adalah memesan kata-kata dengan probabilitas, saya pikir mengabaikan wildcard adalah perkiraan yang dapat diterima. Namun saya masih belum memiliki keterampilan untuk membangun formula untuk menyelesaikan masalah yang lebih sederhana ini
Sébastien
1
Jika Anda ingin memulai dengan lebih sederhana, hitung probabilitas memilih 'B', lalu 'O', lalu 'O', lalu 'T'. Setelah itu, hitung probabilitas memilih huruf dalam urutan apa pun. Setelah itu, faktor fakta bahwa Anda memiliki tujuh percobaan. Kemudian faktor dalam wildcard.
Jerry Schirmer
1
Cara mudah untuk mengatasi masalah ini adalah dengan menggunakan perkiraan Monte Carlo. Apakah ini cukup?
Rasmus Bååth
1
Apakah Anda berbicara tentang membentuk kata-kata hanya dengan huruf yang Anda pilih, atau mempertimbangkan huruf yang sudah dipilih, dan kata-kata yang sudah ditempatkan di papan tulis?
samthebrand

Jawaban:

12

Sebuah rumus diminta. Sayangnya, situasinya sangat rumit sehingga tampaknya formula apa pun hanya akan menjadi jalan memutar untuk menyebutkan semua kemungkinan. Alih-alih, jawaban ini menawarkan algoritma yang (a) sama dengan formula yang melibatkan jumlah produk dari koefisien binomial dan (b) dapat diangkut ke banyak platform.


Untuk mendapatkan formula seperti itu, bagi kemungkinan menjadi kelompok-kelompok yang saling terpisah dalam dua cara: menurut berapa banyak huruf tidak dalam kata yang dipilih di rak (biarkan ini m ) dan menurut berapa banyak wildcard (kosong) yang dipilih ( biarkan ini w ). Ketika ada r=7 petak di rak, N petak tersedia, M petak tersedia dengan huruf tidak ada dalam kata, dan W=2 kosong tersedia, jumlah pilihan yang mungkin diberikan oleh (m,w) adalah

(Mm)(Ww)(NMWrmw)

karena pilihan huruf non-kata, kosong, dan kata-kata bersyarat independen pada (m,w,r).

Ini mengurangi masalah untuk menemukan sejumlah cara untuk mengeja kata ketika memilih hanya dari petak yang mewakili huruf kata, mengingat bahwa kosong tersedia dan r - m - w petak akan dipilih. Situasinya berantakan dan tidak ada formula tertutup yang tersedia. Misalnya, dengan w = 0 kosong dan m = 3 huruf di luar kata ditarik, akan ada empat huruf tersisa untuk mengeja "boot" yang diambil dari ubin "b", "o", dan "t" . Mengingat ada 2 "b", 8 "o", dan 6wrmww=0m=3286"t" ada di set ubin Scrabble, ada kemungkinan positif menggambar (multiset) "bboo", "bbot", "bbtt", "booo", "boot", "bott", "bttt", "oooo "," ooot "," oott "," ottt ", dan" tttt ", tetapi hanya satu dari mantra ini" boot ". Dan itu adalah kasus yang mudah! Misalnya, seandainya rak berisi lima ubin yang dipilih secara acak dari ubin "o", "b", dan "t", bersama dengan keduanya, ada banyak lagi cara untuk mengeja "boot" - dan bukan mengeja. Misalnya, "boot" dapat dieja dari "__boott" dan "__bbttt", tetapi tidak dari "__ttttt".

Penghitungan ini - inti dari masalah - dapat ditangani secara rekursif. Saya akan menggambarkannya dengan sebuah contoh. Misalkan kita ingin menghitung cara mengeja "boot" dengan satu ubin kosong dan empat ubin lagi dari koleksi ubin "b", "o", dan "t" (di mana dua ubin yang tersisa menunjukkan huruf-huruf tidak kosong yang tidak dalam { "b", "o", "t"}). Pertimbangkan huruf pertama, "b":

  1. A "b" dapat ditarik ke dalam cara dari dua ubin "b" yang tersedia. Ini mengurangi masalah untuk menghitung jumlah cara mengeja akhiran "oot" menggunakan kedua kosong dan hanya tiga ubin lagi dari koleksi ubin "o" dan "t".(21)

  2. Satu kosong dapat ditetapkan sebagai "b". Ini mengurangi masalah untuk menghitung jumlah cara mengeja "oot" menggunakan kosong yang tersisa dan hanya tiga ubin lagi dari koleksi ubin "o" dan "t".

Secara umum, langkah (1) dan (2) - yang terpisah dan karena itu berkontribusi secara positif pada perhitungan probabilitas - dapat diimplementasikan sebagai loop atas kemungkinan jumlah kosong yang mungkin digunakan untuk huruf pertama. Pengurangan masalah diselesaikan secara rekursif. Kasing dasar terjadi ketika ada satu huruf tersisa, ada sejumlah ubin dengan surat itu tersedia, dan mungkin ada beberapa kosong di rak juga. Kami hanya perlu memastikan bahwa jumlah kosong di rak ditambah jumlah ubin yang tersedia akan cukup untuk mendapatkan jumlah yang diinginkan dari surat terakhir.

Berikut ini adalah Rkode untuk langkah rekursif. rackbiasanya sama ,adalah array jumlah huruf (seperti),adalah struktur yang sama memberikan jumlah ubin yang tersedia dengan huruf-huruf itu, danjumlah kosong yang diasumsikan terjadi di rak.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))
}

Antarmuka untuk fungsi ini menentukan ubin Scrabble standar, mengubah kata yang diberikan ke dalam struktur data multisetnya, dan melakukan jumlah ganda di atas dan w . Di sinilah koefisien binomialmw dan ( W(Mm) dihitung dan dikalikan.(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)))
}

Mari kita coba solusi ini dan tentukan waktunya. Tes berikut menggunakan input yang sama yang digunakan dalam simulasi oleh @Rasmus Bååth :

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

Mesin ini melaporkan total waktu berlalu detik: cukup cepat. Hasil?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

Probabilitas untuk "boot" dari persis sama dengan nilai 2381831 / 333490850 diperoleh dalam jawaban saya yang lain (yang menggunakan metode yang sama tapi sofa itu dalam kerangka yang lebih kuat membutuhkan platform aljabar komputasi simbolik). Probabilitas untuk semua empat kata yang cukup dekat dengan simulasi Baath (yang tidak bisa diharapkan untuk memberikan nilai yang akurat untuk "zoologi" karena probabilitas rendah dari 11840 / 16007560800 , yang kurang dari satu dalam satu juta).114327888/160075608002381831/33349085011840/16007560800,

whuber
sumber
Solusi keren dan elegan! Dan jauh lebih cepat daripada milikku ... :)
Rasmus Bååth
1
Ini jawaban yang bagus, terima kasih. Saya akan mengalami kesulitan coding algoritma Anda, jadi kode siap pakai sangat welcome. Saya tidak tahu Rtetapi masih berhasil menggunakan fungsi Anda dalam waktu kurang dari satu jam kerja, sehingga skrip mengambil input dari file kamus kata 20k dan menulis hasilnya ke .csv. (ini membutuhkan waktu kurang dari 10 menit pada core i5 mid-range)
Sébastien
16

Jawaban untuk pertanyaan yang direferensikan berlaku di sini secara langsung: buat kamus yang hanya terdiri dari kata target (dan kemungkinan ejaan wildcardnya), hitung kemungkinan rak acak tidak dapat membentuk target, dan kurangi dari . Perhitungan ini cepat.1

Simulasi (ditampilkan di bagian akhir) mendukung jawaban yang dihitung.


Detail

Seperti pada jawaban sebelumnya, Mathematica digunakan untuk melakukan perhitungan.

  1. Tentukan masalah: kata (atau kata-kata, jika Anda suka), huruf, jumlah mereka, dan ukuran rak. Karena semua huruf yang tidak ada dalam kata tersebut bertindak sama, itu sangat mempercepat perhitungan untuk menggantinya dengan simbol tunggal mewakili "huruf apa pun yang tidak ada dalam kata."χ

    word = {b, o, o, t};
    letters = {b, o, t, \[Chi], \[Psi]};
    tileCounts = {2, 8, 6, 82, 2};
    rack = 7;
  2. Buat kamus kata ini (atau kata-kata) dan tambahkan untuk memasukkan semua ejaan wildcard yang mungkin.

    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. Hitung bukan kata-kata:

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

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

    (Ada 185 non-kata dalam kasus ini.)

  4. Hitung peluangnya. Untuk pengambilan sampel dengan penggantian, ganti saja jumlah ubin untuk variabel:

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

    20726341339062500000

    Nilai ini sekitar 0.00756036.

    Untuk pengambilan sampel tanpa penggantian, gunakan kekuatan faktorial alih-alih kekuatan:

    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

    Nilai ini sekitar Perhitungannya praktis instan.0.00714212.


Hasil simulasi

Hasil dari iterasi dengan penggantian: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

Bandingkan dengan nilai yang dihitung relatif terhadap kesalahan standar:

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

1.41259

Perjanjian baik-baik saja, sangat mendukung hasil yang dihitung.

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

Buat perbandingan:

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

0.331106

Kesepakatan dalam simulasi ini sangat bagus.

12

whuber
sumber
13

Jadi ini Monte Carlo , yaitu, kita akan mensimulasikan menggambar ubin jutaan kali dan kemudian kita akan menghitung berapa banyak undian yang disimulasikan menghasilkan kita mampu membentuk kata yang diberikan. Saya telah menulis solusinya dalam R, tetapi Anda bisa menggunakan bahasa pemrograman lain, misalnya Python atau Ruby.

Saya pertama-tama akan menjelaskan cara mensimulasikan satu undian. Pertama mari kita tentukan frekuensi ubin.

# 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

Kemudian mengkodekan kata sebagai vektor jumlah huruf.

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 

Sekarang gambar sampel tujuh ubin dan encode dengan cara yang sama seperti kata.

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 

Akhirnya, hitung huruf apa yang hilang ...

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 

... dan jumlahkan jumlah huruf yang hilang dan kurangi jumlah kosong yang tersedia. Jika hasilnya nol atau kurang, kami berhasil mengeja kata.

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

Namun dalam kasus khusus ini kami tidak ... Sekarang kami hanya perlu mengulanginya berkali-kali dan menghitung persentase pengundian yang berhasil. Semua ini dilakukan oleh fungsi R berikut:

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

Ini repsadalah jumlah undian yang disimulasikan. Sekarang kita dapat mencobanya pada sejumlah kata yang berbeda.

> word_prob("boot")
[1] 0.0072
> word_prob("red")
[1] 0.07716
> word_prob("axe")
[1] 0.05088
> word_prob("zoology")
[1] 2e-05
Rasmus Bååth
sumber
Saya mendapat jawaban berbeda. Sulit untuk mengatakan mengapa mereka tidak setuju, mengingat kompleksitas kode simulasi Anda, tetapi saya akan mulai mencari penyebabnya pada penanganan wildcard kami.
whuber
2
Saya percaya itu sampletidak bertindak seperti yang Anda harapkan. Misalnya, apa yang terjadi pada kode Anda jika gim dimodifikasi untuk memungkinkan rak berisi 28 ubin? Ubah size=7untuk size=28mengetahuinya.
whuber
2
@whuber Kau benar, terima kasih sudah menunjukkan! Sekarang berfungsi dan menghasilkan jawaban yang sama dengan kode Anda!
Rasmus Bååth
Terima kasih atas kerja bagus ini. Memang pendekatan Monte Carlo sangat cocok. Namun, terutama karena alasan kinerja, saya telah memilih untuk menggunakan algoritma perhitungan yang tepat yang disediakan oleh whuber.
Sébastien
7

For the word "BOOT" with no wildcards:

p0=(nb1)(no2)(nt1)(n43)(n7)
With wildcards, it becomes more tedious. Let pk indicate the probability of being able to play "BOOT" with k wildcards:
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
clintonmonk
sumber
The idea is correct (although it would help to explain why and to explain the notation, especially concerning exactly what "n" means: whether it counts all other letters or all other letters and the wildcards), but the treatment of wildcards is incomplete. Without any explanation and without any worked examples, it is difficult to determine whether your formulas are correct so we must consider them unreliable. Generally, it is possible to write down a formula for the probability in terms of sums of products of binomial coefficients.
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 is the total number of tiles, the resulting value is larger than it should be (it equals 8/25850.0031). The same mistake is propagated into the calculations of the wildcard probabilities.
whuber
-1

Meh.

γc=b0xcln(x)r=0(c+y1)(c+α)r(c+β)r(c+1)r(c+γ)rxr+

+b0xcr=0(c+γ1)(c+α)r(c+β)r(c+1)r(c+γ)r(1c+γ1+

+k=0r1(1c+α+κ+1c+β+κ+1c+1+κ1c+γ+κ))xr

=b0xcr=0(c+γ1)(c+α)r(c+β)r(c+1)r(c+γ)r(ln x+1c+γ1+

+k=0r1(1c+α+κ+1c+β+κ1c+1+κ1c+γ+κ))xr
.

It's been a while since I looked at how I built my project. And my math may be entirely incorrect below, or correct. I may have it backwards. Honestly, I forget. BUT! Using only binomial combination, without taking into account blank tiles which throws the entire thing out of whack. The simple combination solution without wild.

I asked these questions myself, and built my own scrabble words probability dictionary because of it. You don't need a dictionary of possible words pulled out, only the math behind it and available letters based on letters in tile bag. The array of English rules is below. I spent weeks developing the math just to answer this question for all English words that can be used in a game, including words that can not be used in a game. It may all be incorrect.

The probability of drawing a given word from a bag of letters in Scrabble, requires how many letters are available in the bag, for each letter ( A-Z ) and, whether we're using the wild card as an addition to the math. The blank tiles are included in this math - assuming 100 tiles, 2 of which are blank. Also, how many tiles are available differs based on language of the game, and game rules from around the world. English scrabble differs from Arabic scrabble, obviously. Just alter the available letters, and the math should do the work.

If anyone finds errors, I will be sure to update and resolve them.

Boot: The probability of Boot in a game of scrabble is 0.000386% which is a chance of 67 out of 173,758 hands as shown on the word page for boot.

English Tiles

all is the array of letters in the bag. count is the array of available tiles for that letter, and point is the point value of the letter.

// 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");

There are 100 tiles in an English scrabble game (i.e., the sum of $count). It does not matter how the tiles are pulled, so it's not a permutation.

The Math I Used Determine how many letters are in the word and what letters are in the word, how many of those letters are available in the tile bag ( count for each letter, unique and allchars ). Binomial coefficient of each, divided by binomial coefficient of length word.

Determine the binomial combinations available

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

Foreach letter, what is the binomial coefficient.

There is 1 "B". There are 2 available, a 2% chance of pulling the b.
There is 2 "O". There are 8 available, a 8% chance of pulling the o.
There is 1 "T". There are 6 available, a 6% chance of pulling the t.
BOOT is a 4 letter word, being taken from a 100 tile set with blanks, 98 without.

n = 98. The number of tiles without blank in the English set

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

B×O×T divided by the binomial coefficient of tilecount 98!98!(98length)!

James Cordeiro
sumber
It's hard to evaluate your solution without knowing what n and r refer to in the final formula. How do you handle the effect of the blank tiles? That's what makes this a difficult problem. Regardless, it would be interesting to see a demonstration that the value of 38248840160075608000.00239 is incorrect: this was obtained using the R solution I posted. Try this one-second R simulation: 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
Re the edit: one obvious error is that your calculation does not account for the number of blanks at all. As far as I can tell from your formulas, if that number were to change (from 2 to 50, say) then your answer would not change. That's obviously wrong. Another problem you face is to explain how your answer can conflict with three other answers already posted, which use three completely different techniques yet agree with one another (and disagree with yours).
whuber
If combinations - the math is binomial coefficients. So, let x be the count of blank tiles. The only math that changes, is n! - is there blanks used, or not. If so, add the count of blank to n! since blank allows 2 more options of every letter possible (n+x)! - if not, leave n! as is. Yes? No? If blanks are not used depending on language rule set in this case English, n! = 98 or 100 with. Each letter without blank is C(n,r), else with blank C((n+x),r). In the array, blank is there - but I forgot to put blank in the math. So just change n to work with blanks. Yes?
James Cordeiro
No, your reasoning is invalid. I invite you to try out your formulas with smaller numbers so you can see where they go wrong.
whuber
What do you mean by smaller numbers - whuber? Give me an example. Are you saying pulling boot from a set of 10 letters instead, 1 b, 2 o, 1 t's with a 1 blank in the set and 5 other letters. Or something completely different. I'm no math major, but it seems we've become poker players. We're now calculating poker odds with scrabble tiles that don't have suits.
James Cordeiro