Scrabble'daki bir çanta harfinden belirli bir kelimeyi çizme olasılığı


18

Her biri üzerinde bir harf bulunan n fayanslı bir çantanız olduğunu varsayalım . Orada nA 'A' harfi ile çinileri nB vb 'B' ile ve ve n'joker' karolar (Elimizdeki n=nA+nB++nZ+n). Sonlu sayıda kelimeden oluşan bir sözlüğünüz olduğunu varsayalım.

k fayanslarını değiştirmeden çantadan alırsınız .

Nasıl sen uzunluğu belirli bir kelimeyi, oluşabilir olasılığını hesaplamak (veya tahmini) olur l (1 <ile l = < k ) Verilen sözlükten k karolar seçilmiş?

Scrabble ™ hakkında bilgi sahibi olmayanlar için joker karakter herhangi bir harfle eşleşmek için kullanılabilir. Böylece 'BOOT' kelimesi 'B', '*', 'O', 'T' çinileriyle 'hecelenebilir'. Harflerin çizilme sırası önemli değil.

Öneri: cevapların yazılmasını basitleştirmek için, sadece soruyu cevaplamak daha iyi olabilir: yeni bir çantadan 7 harf çizdikten sonra olası hareketleriniz arasında 'BOOT' kelimesine sahip olma olasılığı nedir.

(sorunun tanıtımı bu benzer sorudan kopyalanmıştır )


Öncelikle, daha önce joker karakter içermeyen gibi daha basit bir vakayla mücadele etmenizi öneririm.
Glen_b

@Glen_b Kabul ediyorum. Son amacım kelimeleri olasılıkla sıralamak olduğundan, joker karakterleri görmezden gelmek kabul edilebilir bir yaklaşımdır. Ancak yine de bu daha basit sorunu çözmek için bir formül oluşturma
Sébastien

1
Eğer daha basit başlamak istiyorsanız, 'B', sonra 'O', sonra 'O', sonra 'T' seçme olasılığını hesaplayın. Bundan sonra, harfleri herhangi bir sırada toplama olasılığını hesaplayın. Bundan sonra, yedi denemenizin olması faktörü. Sonra joker karakterleri hesaba katın.
Jerry Schirmer

1
Bu problemi çözmenin kolay bir yolu Monte Carlo yaklaşımı kullanmak olacaktır. Bu yeterli olur mu?
Rasmus Bååth

1
Sadece seçtiğiniz harflerle kelime oluşturmaktan mı, yoksa zaten seçilen harfleri ve tahtaya yerleştirilmiş kelimeleri mi dikkate alıyorsunuz?
samthebrand

Yanıtlar:


12

Bir formül isteniyor. Ne yazık ki, durum o kadar karmaşıktır ki, herhangi bir formül sadece tüm olasılıkları sıralamak için dolambaçlı bir yol olacaktır. Bunun yerine, bu cevap bir , (a) binom katsayılarının toplamlarını içeren bir formüle eşit algoritma ve (b) birçok platforma taşınabilir.


Böyle bir formül elde etmek için, olasılıkları karşılıklı olarak ayrık gruplara ayırın : rafta kelimede olmayan harflerin kaçına göre (bu m ) ve kaç joker karakter (boşluk) seçildiğine göre ( bu w ). Olduğunda r=7 rafa fayans, N mevcut zemin, M sözcüğün harfleri ile mevcut kiremit ve W=2 mevcut boşlukları, verilen olası seçim sayısı (m,w) olduğu

(Mm)(Ww)(NMWrmw)

çünkü kelime olmayan harflerin, boşlukların ve kelime harflerinin seçimleri bağımsız koşulludur (m,w,r).

Bu, kelimenin harfleri temsil eden çini sadece seçerken Bir kelimeyi yollarını sayısını bulma problemi azaltır verilen bu boşlukları edilebilir ve r - m - w çini seçilecektir. Durum dağınık ve kapalı formül mevcut değil. Örneğin, w = 0 boşluklar ve m = 3 sözcük dışı harfler çizildiğinde, "b", "o" ve "t" döşemelerinden çizilen "boot" kelimesini hecelemek için tam olarak dört harf kalır. . Verilen 2 "b" s, 8wrmww=0m=328 "o" ve 6Scrabble kiremit kümesinde "t", çizim (multisets) "bboo", "bbot", "bbtt", "booo", "boot", "bott", "bttt", "oooo "," ooot "," oott "," ottt "ve" tttt ", ancak bu büyülerden yalnızca biri" boot ". Ve bu kolay durumdu! Örneğin, rafın "o", "b" ve "t" döşemelerinden rastgele seçilen beş döşemeyi içerdiğini varsayarsak, her iki boşlukla birlikte "çizme" yi hecelemenin ve hecelememenin daha birçok yolu vardır. Örneğin, "önyükleme", "__boott" ve "__bbttt" ifadelerinden hecelenebilir, ancak "__ttttt" öğesinden değil.

Sorunun kalbi olan bu sayım tekrar tekrar ele alınabilir. Bir örnekle anlatacağım. "Boşluk" yazımının "b", "o" ve "t" kutucuklarından oluşan bir boş ve dört kutucukla yazım yollarını saymak istediğimizi varsayalım (geri kalan iki kutucuk boş olmayan harfleri { "b", "o", "t"}). İlk harfi "b" düşünün:

  1. Bir "b" çizilebilir mevcut iki "b" kiremit yolları. Bu, "o" ve "t" fayans koleksiyonundan hem boşlukları hem de sadece üç karo kullanarak "oot" sonekini yazmanın yollarını sayma sorununu azaltır.(21)

  2. Bir boşluk "b" olarak tanımlanabilir. Bu, kalan boş ve "o" ve "t" fayans koleksiyonundan sadece üç karo kullanarak "oot" yazım yollarının sayısını sayma sorununu azaltır.

Genel olarak, ayrık olan ve dolayısıyla olasılık hesaplamalarına katkı sağlayan katkıda bulunan (1) ve (2) aşamaları, ilk harf için kullanılabilecek boşluk sayısının üzerinde bir döngü olarak uygulanabilir. Azalan problem özyinelemeli olarak çözülür. Temel durum, bir harf kaldı, bu harfin bulunduğu belirli sayıda karo olduğunda oluşur ve rafta da bazı boşluklar olabilir. Sadece raftaki boşluk sayısının ve mevcut döşemelerin sayısının son mektubun istenen miktarını elde etmek için yeterli olduğundan emin olmalıyız.

İşte Rözyinelemeli adım için kod. rackGenellikle eşittir , harfler (örneğin, ve sayıları bir dizisi olan ), bu harflerle mevcut kiremit numaraları veren benzer bir yapıdır, ve boşlukların sayısı rafa oluştuğu varsayılmaktadır.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))
}

Bu işleve yönelik bir arabirim standart Scrabble döşemelerini belirtir, belirli bir sözcüğü çok kümeli veri yapısına dönüştürür ve ve w üzerinde çift toplamı gerçekleştirir . İşte binom katsayıları ( Mmw ve ( W(Mm) hesaplanır ve çoğaltılır.(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)))
}

Bu çözümü deneyelim ve giderken zamanlayalım. Aşağıdaki test @Rasmus Bååth tarafından yapılan simülasyonlarda kullanılan girişlerin aynısını kullanır :

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

Bu makine toplam geçen süreyi saniye olarak bildirir : oldukça hızlı. Sonuçlar?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

Arasında "çizme" için olasılık tam değer eşittir 2381831 / 333.490.850 elde benim diğer yanıt (sembolik cebir hesaplama platformu gerektiren daha güçlü bir çerçeveye benzer bir yöntem ama kanepe bunu kullanır). Dört kelime olasılıkları (dolayı onun ihtimali olduğu için "zooloji" için doğru bir değer vermesi bekleniyor edilemedi makul yakın Baas simülasyonları için vardır 11840 / 16007560800 , az milyonda biri daha).114327888/160075608002381831/33349085011840/16007560800,


Serin ve zarif bir çözüm! Ve benimkinden çok daha hızlı ... :)
Rasmus Bååth

1
Bu harika bir cevap, teşekkürler. Ben algoritma kodlama zor bir zaman olurdu, bu yüzden kullanıma hazır kod çok açığız. Bilmiyordum Rama yine de işlevlerinizi bir saatten daha az bir süre içinde kullanmayı başardım, böylece komut dosyası 20k kelimelik bir sözlük dosyasından girdi alır ve sonuçları bir .csv'ye yazar. (bu, orta sınıf bir çekirdek i5'te 10 dakikadan az sürdü)
Sébastien

16

Verilen yanıtlar başvurulan soruya doğrudan burada geçerli: Sadece hedef sözcüğü (ve olası joker yazımlar) oluşan bir sözlük oluşturmak rastgele raf hedefini oluşturmaktadır ve o çıkarma olamayacağını şans hesaplamak 1 . Bu hesaplama hızlı.

Simülasyonlar (sonunda gösterilir) hesaplanan cevapları destekler.


ayrıntılar

Önceki cevapta olduğu gibi, Mathematica hesaplamaları yapmak için kullanılır.

  1. Sorunu belirtin: kelime (veya isterseniz kelimeler), harfler, sayıları ve raf boyutu. Değil kelimenin tüm harfleri aynı hareket nedeniyle, büyük ölçüde tek bir sembolle hepsini yerine hesaplama hızları temsil "kelimesinde değil herhangi bir harf."χ

    word = {b, o, o, t};
    letters = {b, o, t, \[Chi], \[Psi]};
    tileCounts = {2, 8, 6, 82, 2};
    rack = 7;
  2. Bu kelimenin (veya kelimelerin) sözlüğünü oluşturun ve tüm olası joker karakter yazımlarını içerecek şekilde artırın.

    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'ü hesaplayın:

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

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

    ( Bu durumda kelime olmayan.)185

  4. Şansı hesaplayın. Değiştirme ile örnekleme için, değişkenlerin karo sayısını değiştirin:

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

    20726341339062500000

    Bu değer yaklaşık 0.00756036.

    Değiştirilmeden örnekleme için, güçler yerine faktöriyel güçleri kullanın:

    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

    Bu değer yaklaşık Hesaplamalar hemen gerçekleşti.0.00714212.


Simulasyon sonuçları

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

Standart hataya göre hesaplanan değerle karşılaştırın:

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

1.41259

Anlaşma gayet iyi, hesaplanan sonucu güçlü bir şekilde destekliyor.

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

Karşılaştırma yapın:

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

0.331106

Bu simülasyondaki anlaşma mükemmeldi.

12


13

Bu bir Monte Carlo çözümü, yani fayansları milyonlarca kez çizmeyi simüle edeceğiz ve sonra bu simüle edilen çekimlerin kaç tanesinin verilen kelimeyi oluşturabilmemize neden olduğunu hesaplayacağız. Çözümü R dilinde yazdım, ancak Python veya Ruby gibi başka bir programlama dili kullanabilirsiniz.

İlk önce bir çekilişin nasıl simüle edileceğini anlatacağım. Önce döşeme frekanslarını tanımlayalım.

# 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

Sonra sözcüğü harf sayımlarının bir vektörü olarak kodlayın.

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 

Şimdi yedi karo örneği çizin ve bunları kelimeyle aynı şekilde kodlayın.

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 

Sonunda, hangi harflerin eksik olduğunu hesaplayın ...

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 

... ve eksik harflerin sayısını toplayın ve kullanılabilir boşlukların sayısını çıkarın. Sonuç sıfır veya daha azsa kelimeyi hecelemeyi başardık.

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

Bu özel durumda biz yapmadık ... Şimdi bunu birçok kez tekrarlamamız ve başarılı berabere yüzdesini hesaplamamız gerekiyor. Bütün bunlar aşağıdaki R fonksiyonu ile yapılı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)
}

İşte repsçizer simüle sayısıdır. Şimdi bunu birkaç farklı kelime üzerinde deneyebiliriz.

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

Farklı cevaplar alıyorum. Simülasyon kodunuzun karmaşıklığı göz önüne alındığında, neden katılmadıklarını söylemek zor, ancak joker karakterleri ele alma nedenimizi aramaya başlayacağım.
whuber

2
Bunun samplebeklediğiniz gibi davranmadığına inanıyorum . Örneğin, oyun 28 taşlık bir rafa izin verecek şekilde değiştirilirse kodunuza ne olur? Öğrenmek size=7için değiştirin size=28.
whuber

2
@whuber Haklısın, işaret ettiğin için teşekkürler! Şimdi çalışıyor ve kodunuzla aynı cevabı veriyor!
Rasmus Bååth

Bu güzel iş için teşekkürler. Gerçekten de bir Monte Carlo yaklaşımı mükemmel bir şekilde uygundur. Ancak, esas olarak performans nedenleriyle, whuber tarafından sağlanan kesin hesaplama algoritmasını kullanmayı seçtim.
Sébastien

7

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

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


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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.