Załóżmy, że masz torbę z płytkami, z których każda zawiera literę. Są kafelki z literą „A”, z „B” itd. , „symbole wieloznaczne” (mamy ). Załóżmy, że masz słownik ze skończoną liczbą słów.n A n B n ∗ n = n A + n B + … + n Z + n ∗
Z torby wybierasz płytek bez wymiany.
Jak obliczysz (lub oszacujesz) prawdopodobieństwo, że możesz utworzyć dane słowo o długości (z 1 < l = < k ) ze słownika, biorąc pod uwagę wybrane k płytek?l k
W przypadku osób niezaznajomionych ze Scrabble (TM) można użyć znaku zastępczego, aby dopasować dowolną literę. Zatem słowo „BOOT” może być „ortograficzne” z kafelkami „B”, „*”, „O”, „T”. Kolejność rysowania liter nie ma znaczenia.
Sugestia: aby uprościć pisanie odpowiedzi, lepiej po prostu odpowiedzieć na pytanie: jakie jest prawdopodobieństwo, że słowo „BOOT” będzie wśród twoich możliwych ruchów po wyciągnięciu 7 liter ze świeżej torby.
(wprowadzenie problemu zostało skopiowane z tego podobnego pytania )
źródło
Odpowiedzi:
Wymagana jest formuła . Niestety sytuacja jest tak skomplikowana, że wydaje się, że każda formuła będzie jedynie okrężnym sposobem wyliczenia wszystkich możliwości. Zamiast tego ta odpowiedź oferuje algorytm, który jest (a) równoznaczny ze wzorem obejmującym sumy iloczynów współczynników dwumianowych i (b) może być przeniesiony na wiele platform.
Aby uzyskać taką formułę, podziel możliwości na wzajemnie rozłączne grupy na dwa sposoby: w zależności od liczby liter spoza słowa wybranych w stojaku (niech to będzie ) i według liczby symboli wieloznacznych (pustych) niech to będzie wagowo ). Gdy w stojaku znajduje się r = 7 płytek, N dostępnych płytek, M dostępnych płytek z literami niewymienionymi w słowie, a W = 2 puste pola, liczba możliwych wyborów podana przez ( m , w ) wynosim w r=7 N M W=2 (m,w)
ponieważ wybory liter niebędących słowami, spacji i liter są niezależne od( m , w , r ) .
Zmniejsza to problem ze znalezieniem liczby sposobów przeliterowania słowa przy wybieraniu tylko z kafelków reprezentujących litery słowa, biorąc pod uwagę, że są dostępne puste pola i zostaną płytki . Sytuacja jest chaotyczna i wydaje się, że nie ma zamkniętej formuły. Na przykład, jeśli pustych pól i niesymetryczne litery zostaną narysowane, pozostaną dokładnie cztery litery, które przeliterują „boot”, które zostały narysowane z kafelków „b”, „o” i „t” . Biorąc pod uwagę, że są „b”, „o” ir - m - w w = 0 m = 3 2 8 6w r - m - w w = 0 m = 3 2) 8 6 „t” w zestawie kafelków Scrabble, istnieją pozytywne prawdopodobieństwa rysowania (multisetów) „bboo”, „bbot”, „bbtt”, „booo”, „boot”, „bott”, „bttt”, „oooo ”,„ ooot ”,„ oott ”,„ ottt ”i„ tttt ”, ale tylko jedno z tych zaklęć„ boot ”. I to był łatwy przypadek! Na przykład, zakładając, że stojak zawiera pięć losowo wybranych kafelków z płytek „o”, „b” i „t”, wraz z oboma pustymi polami, istnieje wiele innych sposobów na przeliterowanie „rozruchu” - i nie przeliterowanie go. Na przykład „boot” można przeliterować z „__boott” i „__bbttt”, ale nie z „__ttttt”.
Liczenie to - sedno problemu - można rozwiązać rekurencyjnie. Opiszę to na przykładzie. Załóżmy, że chcemy policzyć pisownię „boot” z jednym pustym i czterema dodatkowymi kafelkami z kolekcji płytek „b”, „o” i „t” (skąd pozostałe dwa kafelki pokazują niepuste litery nie w { „b”, „o”, „t”}). Rozważ pierwszą literę „b”:
„B” można narysować na z dwóch dostępnych kafelków „b”. Zmniejsza to problem do zliczania liczby sposobów przeliterowania przyrostka „oot” przy użyciu obu pustych pól i tylko trzech kolejnych płytek z kolekcji płytek „o” i „t”.( 21)
Jeden pusty może być oznaczony jako „b”. Zmniejsza to problem do zliczania liczby sposobów pisowni „oot” przy użyciu pozostałego pustego miejsca i tylko trzech kolejnych kafelków z kolekcji płytek „o” i „t”.
Zasadniczo kroki (1) i (2) - które są rozłączne, a zatem przyczyniają się dodatkowo do obliczeń prawdopodobieństwa - mogą zostać zaimplementowane jako pętla nad możliwą liczbą odstępów, które mogą być użyte dla pierwszej litery. Ograniczony problem rozwiązano rekurencyjnie. Podstawowy przypadek występuje, gdy pozostała jedna litera, dostępna jest pewna liczba płytek z tą literą, a także mogą być pewne puste miejsca w stojaku. Musimy tylko upewnić się, że liczba pustych miejsc w stojaku plus liczba dostępnych płytek wystarczą, aby uzyskać pożądaną ilość tej ostatniej litery.
Oto7
R
kod kroku rekurencyjnego.rack
zwykle wynosi , jest tablicą zliczeń liter (np. ), jest podobną strukturą podającą liczbę dostępnych płytek z tymi literami i jest liczbą założonych pustych miejsc w szafie.word
c(b=1, o=2, t=1)
alphabet
wild
Interfejs tej funkcji określa standardowe kafelki Scrabble, konwertuje dane słowo na wielosetową strukturę danych i wykonuje podwójną sumę na i w . Oto gdzie współczynniki dwumianowe ( Mm w i ( W( Mm) są obliczane i mnożone.(Ww)
Wypróbujmy to rozwiązanie i zmierzmy je do końca. Poniższy test wykorzystuje te same dane wejściowe wykorzystane w symulacjach @Rasmus Bååth :
To urządzenie podaje całkowity czas, który upłynął sekundy: dość szybko. Wyniki?0.05
Prawdopodobieństwo dla „bagażnik” z dokładnie równa wartości 2381831 / +333.490.850 uzyskanego w innym moją odpowiedź (który używa podobnej metody, ale kanapy go w mocniejszy ramach wymagającego symboliczną platformę algebra obliczeniowej). Prawdopodobieństwa dla wszystkich czterech słów są dość blisko do symulacji Baas (który nie mógł się spodziewać, aby dać dokładną wartość „zoologia” ze względu na jego niskie prawdopodobieństwo 11840 / 16007560800 , który jest mniej niż jedna na milion).114327888/16007560800 2381831/333490850 11840/16007560800,
źródło
R
ale nadal udało mi się użyć twoich funkcji w mniej niż godzinę pracy, więc skrypt pobiera dane wejściowe z pliku słownika zawierającego 20 000 słów i zapisuje wyniki w .csv. (zajęło to mniej niż 10 minut na rdzeniu średniej klasy i5)Odpowiedzi na przytoczone pytanie mają tutaj zastosowanie bezpośrednio: utwórz słownik składający się tylko ze słowa docelowego (i jego możliwych pisowni symboli wieloznacznych), oblicz szansę, że losowy stojak nie może utworzyć celu i odejmij go od . To obliczenie jest szybkie.1
Symulacje (pokazane na końcu) obsługują obliczone odpowiedzi.
Detale
Podobnie jak w poprzedniej odpowiedzi, Mathematica służy do wykonywania obliczeń.
Określ problem: słowo (lub słowa, jeśli chcesz), litery, ich liczbę i rozmiar szafy. Ponieważ nie wszystkie litery w słowie działać tak samo, to znacznie przyspiesza obliczenia zastąpić je wszystkie za pomocą pojedynczego symbolu reprezentujący „żadnego listu nie w słowie”.χ
Utwórz słownik tego słowa (lub słów) i rozszerz go, aby zawierał wszystkie możliwe pisowni symboli wieloznacznych.
Oblicz słowa niezwiązane:
(W tym przypadku jest nie-słów.)185
Oblicz szanse. Aby pobrać próbkę z zamiennikiem, wystarczy zastąpić liczbę płytek zmiennymi:
Ta wartość wynosi około0.00756036.
Do pobierania próbek bez zamiany użyj mocy silnych zamiast mocy:
Ta wartość wynosi około Obliczenia były praktycznie natychmiastowe.0.00714212.
Wyniki symulacji
Porównaj go z obliczoną wartością w stosunku do jego błędu standardowego:
Umowa jest w porządku, zdecydowanie popierając obliczony wynik.
Dokonaj porównania:
Zgodność w tej symulacji była doskonała.
źródło
To jest rozwiązanie Monte Carlo , to znaczy, będziemy symulować rysowanie kafelków zillion razy, a następnie obliczymy, ile z tych symulowanych losowań spowodowało, że jesteśmy w stanie uformować dane słowo. Napisałem rozwiązanie w języku R, ale możesz użyć dowolnego innego języka programowania, na przykład Python lub Ruby.
Najpierw opiszę, jak symulować jedno losowanie. Najpierw zdefiniujmy częstotliwości kafelków.
Następnie zakoduj słowo jako wektor liczenia liter.
Teraz narysuj próbkę siedmiu płytek i zakoduj je w taki sam sposób, jak słowo.
Na koniec obliczyć, jakich liter brakuje ...
... i zsumuj liczbę brakujących liter i odejmij liczbę dostępnych spacji. Jeśli wynik wynosi zero lub mniej, udało nam się przeliterować słowo.
W tym konkretnym przypadku nie zrobiliśmy tego ... Teraz musimy tylko powtórzyć to wiele razy i obliczyć odsetek udanych losowań. Wszystko to odbywa się za pomocą następującej funkcji R:
Oto
reps
liczba symulowanych losowań. Teraz możemy wypróbować to na kilku różnych słowach.źródło
sample
to nie działa tak, jak się wydaje. Na przykład, co stanie się z Twoim kodem, jeśli gra zostanie zmodyfikowana w taki sposób, aby zezwalał na zestaw 28 płytek? Zmień,size=7
abysize=28
się dowiedzieć.źródło
Meh.
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.
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
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
źródło
R
solution I posted. Try this one-secondR
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))))