글자 맞추기에서 한 봉지에서 주어진 단어를 그릴 가능성


18

타일 이있는 가방이 있고 각각에 글자 가있는 것으로 가정 하십시오. 문자 'A' 가있는 타일, 'B'가있는 등, '와일드 카드'타일이 있습니다 ( ). 한정된 수의 단어가있는 사전이 있다고 가정합니다.nnAnBnn=nA+nB++nZ+n

당신은 선택 교체없이 가방에서 타일을.k

타일이 주어진 사전에서 길이 (1 < = < ) 의 주어진 단어를 형성 할 확률을 어떻게 계산 (또는 추정) 하시겠습니까?llkk

Scrabble (TM)에 익숙하지 않은 사용자는 와일드 카드 문자를 사용하여 모든 문자를 일치시킬 수 있습니다. 따라서 'BOOT'라는 단어는 타일 'B', '*', 'O', 'T'로 '맞춤법'이 될 수 있습니다. 문자가 그려지는 순서는 중요하지 않습니다.

제안 : 답안 작성을 단순화하기 위해 질문에 대답하는 것이 좋습니다. 새로운 가방에서 7 글자를 그린 후 가능한 동작 중 'BOOT'라는 단어가있을 확률은 얼마입니까?

(문제 소개는 이와 비슷한 질문 에서 복사되었습니다 )


와일드 카드가없는 경우와 같이 간단한 경우를 먼저 다루는 것이 좋습니다.
Glen_b-복지 주 모니카

@Glen_b 동의합니다. 마지막 목적은 단어를 확률 적으로 정렬하는 것이므로 와일드 카드를 무시하는 것이 허용되는 근사치라고 생각합니다. 그러나 저는 여전히이 간단한 문제를 해결하기위한 공식을 만들 수있는 기술이 없습니다
Sébastien

1
더 간단하게 시작하려면 'B', 'O', 'O', 'T'를 골라 낼 확률을 계산하십시오. 그 후, 어떤 순서로 문자를 고를 확률을 계산하십시오. 그 후, 당신이 일곱 번 시도한다는 사실을 고려하십시오. 그런 다음 와일드 카드를 고려하십시오.
Jerry Schirmer

1
이 문제를 해결하는 쉬운 방법은 Monte Carlo 근사법을 사용하는 것입니다. 이것으로 충분합니까?
Rasmus Bååth

1
선택한 글자만으로 단어를 구성하거나 이미 선택한 글자와 이미 칠판에 놓인 단어를 고려하는 것에 대해 이야기하고 있습니까?
samthebrand

답변:


12

수식 요구된다. 불행히도 상황은 너무 복잡하여 모든 수식이 모든 가능성을 열거하는 원형 길 일뿐입니다. 대신에,이 답변은 (a) 이항 계수의 곱의 합을 포함하는 공식에 탄탈 가능하고 (b) 많은 플랫폼으로 이식 될 수 있는 알고리즘 을 제공합니다 .


이러한 공식을 얻으려면 두 가지 방법으로 가능성을 서로 분리 된 그룹으로 분류 하십시오. 랙에서 단어에 포함 되지 않은 문자 수에 따라 (이것은 ), 선택한 와일드 카드 (공백) 수에 따라 ( 이것이 w ). 이 때 , R = 7 개 랙 타일 N 가능한 타일 M 없는 단어의 글자와 타일 가능하고, W = 2 사용할 블랭크, 주어진 가능한 선택의 수 ( m은 , ) 이고mwr=7NMW=2(m,w)

(Mm)(Ww)(NMWrmw)

비 단어 문자, 공백 및 단어 문자의 선택은 ( m , w , r ) 에 독립적 인 조건부이기 때문에 .(m,w,r).

이 단어의 문자를 나타내는 타일에서만 선택할 때 단어를 철자하는 방법의 수를 찾는 문제를 감소 주어진 것을 공백을 사용할 수 있으며, 타일이 선택됩니다. 상황이 지저분하고 닫힌 공식이 없습니다. 예를 들어, 공백과 단어를 벗어난 문자가 그려지면 "b", "o"및 "t"타일에서 가져온 "부팅"을 철자하기 위해 정확히 4 개의 문자가 남습니다. . 감안있다 '의 "B" 의 "O"'및wrmww=0m=3286"t"는 글자 맞추기 타일 세트에 있으며, 그림 (멀티 세트) "bboo", "bbot", "bbtt", "booo", "boot", "bott", "bttt", "oooo의 긍정적 확률이 있습니다. ","ooot ","oott ","ottt "및"tttt "이지만이 중 하나만"부팅 "입니다. 그리고 그것은 쉬운 경우였습니다! 예를 들어, 랙에 "o", "b"및 "t"타일에서 무작위로 선택된 5 개의 타일이 있고 두 공백과 함께 "부팅"을 철자가 아닌 철자가 많은 방법이 있다고 가정합니다. 예를 들어 "boot"는 "__boott"및 "__bbttt"에서 철자를 입력 할 수 있지만 "__ttttt"는 철자를 지정할 수 없습니다.

문제의 핵심 인이 계산은 재귀 적으로 처리 될 수 있습니다. 예를 들어 설명하겠습니다. "b", "o"및 "t"타일 모음에서 하나의 공백과 4 개의 타일을 사용하여 "부팅"철자법을 세고 싶다고 가정합니다 (나머지 두 타일은 { "b", "o", "t"}). 첫 글자 "b"를 보자.

  1. "b"는 사용 가능한 두 개의 "b"타일 에서 방식 으로 그릴 수 있습니다. 이렇게하면 공백과 "o"및 "t"타일 모음에서 세 개의 타일 만 사용하여 접미사 "oot"를 철자하는 방법의 수를 계산하는 문제가 줄어 듭니다.(21)

  2. 하나의 공백을 "b"로 지정할 수 있습니다. 이렇게하면 나머지 공백과 "o"및 "t"타일 모음에서 3 개 이상의 타일을 사용하여 "oot"철자를 쓰는 방법의 수를 계산하는 문제가 줄어 듭니다.

일반적으로 (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))
}

이 함수에 대한 인터페이스는 표준 Scrabble 타일을 지정하고 주어진 단어를 다중 집합 데이터 구조로 변환하고 과 대해 이중 합을 수행합니다 . 이항 계수 및 이 계산되고 곱해지는 위치입니다.mw(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

"부팅"확률 은 필자의 다른 답변 에서 얻은 의 값과 정확히 같습니다 (유사한 방법을 사용하지만 상징적 인 대수 컴퓨팅 플랫폼을 요구하는 더 강력한 프레임 워크에 포함). 네 단어에 대한 확률 (때문에 자사의 낮은 확률로 '동물학 "에 대한 정확한 값을 제공 할 것으로 예상 할 수없는 합리적으로 가까운 바트의 시뮬레이션에 있습니다 덜 만에 하나보다).114327888/160075608002381831/33349085011840/16007560800,


시원하고 우아한 솔루션! 그리고 훨씬 더 빨리 나보다 ... :)
라스무스 바트

1
감사합니다. 알고리즘을 코딩하는 데 어려움을 겪었으므로 코드를 사용할 준비가 된 것을 매우 환영합니다. 나는 몰랐지만 R여전히 한 시간 안에 작업을 사용하여 스크립트를 사용하여 20k 단어 사전 파일에서 입력을 받아 결과를 .csv에 씁니다. (중급 코어 i5에서 10 분 미만 소요됨)
Sébastien

16

참조 된 질문대한 답변 은 여기에 직접 적용됩니다 : 대상 단어 (및 가능한 와일드 카드 철자)로만 구성된 사전을 만들고 임의 랙이 대상을 형성 할 수없는 확률을 계산하고 에서 빼십시오 . 이 계산은 빠릅니다.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. 비 단어를 계산하십시오.

    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 

이제 7 개의 타일 샘플을 그리고 단어와 같은 방식으로 인코딩합니다.

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 

... 그리고 누락 된 문자 수를 합산하고 사용 가능한 공백 수를 뺍니다. 결과가 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

이 멋진 일에 감사드립니다. 실제로 Monte Carlo의 접근 방식은 완벽하게 적합합니다. 그러나 주로 성능상의 이유로 whuber에서 제공하는 정확한 계산 알고리즘을 사용하기로 선택했습니다.
Sébastien

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


1
0=1008/25850.0031

-1

Meh.

γ=0엑스(엑스)아르 자형=0(+와이1)(+α)아르 자형(+β)아르 자형(+1)아르 자형(+γ)아르 자형엑스아르 자형+

+0엑스아르 자형=0(+γ1)(+α)아르 자형(+β)아르 자형(+1)아르 자형(+γ)아르 자형(1+γ1+

+케이=0아르 자형1(1+α+κ+1+β+κ+1+1+κ1+γ+κ))엑스아르 자형

=0엑스아르 자형=0(+γ1)(+α)아르 자형(+β)아르 자형(+1)아르 자형(+γ)아르 자형( 엑스+1+γ1+

+케이=0아르 자형1(1+α+κ+1+β+κ1+1+κ1+γ+κ))엑스아르 자형

프로젝트를 어떻게 구축했는지 살펴본 지 오래되었습니다. 그리고 내 수학은 아래에서 완전히 틀리거나 정확할 수 있습니다. 거꾸로 가질 수 있습니다. 솔직히 잊어 버립니다. 그러나! 빈 타일을 고려하지 않고 이항 조합 만 사용하면 모든 것을 비틀어 버릴 수 있습니다. 야생없이 간단한 조합 솔루션.

나는이 질문들을 스스로 물었고, 그것 때문에 내 자신의 글자 맞추기 단어 확률 사전을 만들었 습니다. 당신은 가능한 단어 사전을 뽑을 필요가 없으며 그 뒤에있는 수학과 타일 백의 문자를 기반으로 한 사용 가능한 문자 만 필요합니다. 영어 규칙 배열은 다음과 같습니다. 게임에서 사용할 수없는 단어를 포함하여 게임에서 사용할 수있는 모든 영어 단어에 대해이 질문에 답하기 위해 수학을 개발하는 데 몇 주가 걸렸습니다. 모두 잘못되었을 수 있습니다.

글자 맞추기에서 한 글자의 백에서 주어진 단어를 그릴 확률은 각 글자 (AZ)에 대해 백에서 사용할 수있는 글자 수와 수학에 와일드 카드를 사용하는지 여부를 요구합니다. 이 타일에는 100 개의 타일이 있다고 가정하고이 중 2 개는 비어 있다고 가정합니다. 또한 사용 가능한 타일 수는 게임 언어 및 전 세계의 게임 규칙에 따라 다릅니다. 영어 글자 맞추기는 아랍어 글자 맞추기와 다릅니다. 사용 가능한 문자를 변경하면 수학이 작동합니다.

누구든지 오류를 발견하면 업데이트하고 해결해야합니다.

Boot : 글자 맞추기 게임에서 부팅 확률은 0.000386 %이며 부팅 단어 페이지에 표시된대로 173,758 개 중 67 개가 될 가능성이 있습니다.

영어 타일

모두 는 가방에 문자 배열입니다. count 는 해당 문자에 사용 가능한 타일의 배열이며 point 는 문자 의 포인트 값입니다.

// 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 % 확률로 t를 당길 수 있습니다.
BOOT는 4 글자 단어로, 공백없이 98 개의 타일없이 100 개의 타일 세트에서 가져옵니다.

n = 98. 영어 세트에서 공백이없는 타일 수

=(21)=2!2!(21)!
영형=(82)=8!8!(82)!
=(61)=6!6!(61)!

×영형× 타일 ​​수의 이항 계수로 나눈 값 98!98!(98이자형h)!


무엇을 모른 채 솔루션을 평가하기가 어렵습니다. 아르 자형최종 공식을 참조하십시오. 빈 타일의 효과를 어떻게 처리합니까? 이것이 어려운 문제입니다. 그럼에도 불구하고, 가치가38248840160075608000.00239잘못되었습니다 : 이것은 R게시 한 솔루션을 사용하여 얻었습니다 . 이 1 초 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으로 바뀌면 대답은 변하지 않을 것입니다. 분명히 틀 렸습니다. 또 다른 문제는 답변이 이미 게시 된 다른 답변 3 개와 충돌하는 방법을 설명하는 것입니다.이 답변은 완전히 다른 3 가지 기술을 사용하지만 서로 동의하고 자신의 의견에 동의하지 않습니다.
whuber

조합-수학은 이항 계수입니다. 따라서 x는 빈 타일의 개수입니다. 변하는 유일한 수학은 n입니다! -사용 된 여백이 있습니까? 그렇다면 n에 공백 수를 추가하십시오! 공백은 모든 문자에 대해 2 가지 옵션을 더 허용합니다 (n + x)! -그렇지 않다면 n을 남겨주세요! 그대로. 예? 아니? 이 경우 영어로 설정된 언어 규칙에 따라 공백을 사용하지 않으면 n! = 98 또는 100 공백이없는 각 문자는 C (n, r)이고 그렇지 않은 경우 공백 C ((n + x), r)입니다. 배열에는 공백이 있지만 수학에 공백을 두는 것을 잊었습니다. 따라서 공백으로 작업하려면 n을 변경하십시오. 예?
James Cordeiro

아니요, 추론이 잘못되었습니다. 더 작은 숫자로 수식을 시험 해보고 어디에서 잘못되었는지 확인할 수 있습니다.
whuber

더 적은 수의 의미는 무엇입니까-whuber? 예를 들어주세요. 당신은 세트에서 1 개의 공백과 5 개의 다른 문자로 1 개의 문자, 1 개의 b, 2 o, 1 개의 t 대신 10 개의 문자 세트에서 부팅을 당기고 있다고 말하고 있습니까? 아니면 완전히 다른 것. 저는 수학 전공은 아니지만 포커 플레이어가 된 것 같습니다. 우리는 이제 어울리지 않는 글자 맞추기 타일로 포커 확률을 계산하고 있습니다.
James Cordeiro
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.