স্ক্র্যাবলের চিঠিগুলির ব্যাগ থেকে প্রদত্ত শব্দ আঁকার সম্ভাবনা


18

ধরুন আপনার কাছে একটি ব্যাগ রয়েছে যার সাথে n টাইলস রয়েছে এবং এর প্রতিটি চিঠি রয়েছে with আছে nA চিঠি 'এ', সঙ্গে টাইলস nB 'বি' সঙ্গে, ইত্যাদি, এবং n'ওয়াইল্ডকার্ড' টাইলস (আমরা আছে n=nA+nB++nZ+n)। ধরুন আপনার কাছে একটি সীমাবদ্ধ সংখ্যার শব্দযুক্ত অভিধান রয়েছে।

আপনি ব্যাগ থেকে k টাইলস প্রতিস্থাপন ছাড়াই বেছে নিন ।

আপনি কিভাবে গনা হবে (বা অনুমান) সম্ভাব্যতা আপনি একটি প্রদত্ত শব্দ, দৈর্ঘ্য গঠন করতে পারেন l (1 <সঙ্গে l = < k ) অভিধান প্রদত্ত থেকে k টাইল নির্বাচিত?

স্ক্র্যাবল (টিএম) এর সাথে পরিচিত নয় তাদের জন্য, ওয়াইল্ডকার্ড চরিত্রটি যে কোনও বর্ণের সাথে মিলে যায়। সুতরাং 'বুট' শব্দটি 'বি', '*', 'ও', 'টি' টাইলগুলির সাথে 'বানান' হতে পারে। যে ক্রমে অক্ষরগুলি আঁকানো হবে তাতে কিছু যায় আসে না।

পরামর্শ: উত্তরের লেখাকে সহজ করার জন্য, কেবলমাত্র এই প্রশ্নের উত্তর দেওয়া আরও ভাল হতে পারে: একটি তাজা ব্যাগ থেকে 7 টি অক্ষর আঁকার পরে আপনার সম্ভাব্য পদক্ষেপের মধ্যে 'বুট' শব্দটি থাকার সম্ভাবনা কী?

(সমস্যার পরিচয় এই একই প্রশ্ন থেকে অনুলিপি করা হয়েছে )


আমি প্রথমে একটি সহজ কেস মোকাবেলার পরামর্শ দেব, যেমন ওয়াইল্ডকার্ডবিহীন একটি।
গ্লেন_বি -রিনস্টেট মনিকা

@ Glen_b আমি সম্মত আমার চূড়ান্ত উদ্দেশ্যটি সম্ভাব্যতার দ্বারা শব্দগুলি অর্ডার করা, আমি মনে করি ওয়াইল্ডকার্ডগুলি উপেক্ষা করা একটি গ্রহণযোগ্য অনুমান। তবে এই সহজ সমস্যাটি সমাধানের জন্য আমার এখনও কোনও সূত্র তৈরি করার দক্ষতা নেই
সাবেস্টিয়ান

1
আপনি যদি এখনও সহজ শুরু করতে চান তবে 'বি' বাছাই করার সম্ভাবনা গণনা করুন, তারপরে 'ও', তারপরে 'ও', তারপরে 'টি'। এর পরে, কোনও ক্রমে চিঠিগুলি বাছাইয়ের সম্ভাবনা গণনা করুন। এর পরে, আপনার সাতটি চেষ্টা করার বিষয়টি ফ্যাক্টর করুন। তারপরে তিনি ওয়াইল্ডকার্ডগুলি ফ্যাক্টর করুন।
জেরি শির্মার

1
এই সমস্যাটিতে আসার একটি সহজ উপায় হ'ল মন্টি কার্লো আনুমানিকতা ব্যবহার করা। এই যথেষ্ট হবে?
রাসমুস বুথ

1
আপনি যে চিঠিগুলি বেছে নিয়েছেন সেগুলি দিয়ে শব্দ গঠন করার বিষয়ে, বা ইতিমধ্যে নির্বাচিত চিঠিগুলি এবং বোর্ডে ইতিমধ্যে রাখা শব্দগুলি বিবেচনার বিষয়ে কথা বলছেন?
সামথিব্র্যান্ড

উত্তর:


12

একটি সূত্র অনুরোধ করা হয়েছে। দুর্ভাগ্যক্রমে, পরিস্থিতি এত জটিল যে দেখা যাচ্ছে যে কোনও সূত্র কেবল সমস্ত সম্ভাবনার গণনা করার চক্রাকার উপায় হবে। পরিবর্তে, এই উত্তরটি একটি অ্যালগরিদম সরবরাহ করে যা (ক) দ্বিপদী সহগের পণ্য সংখ্যার সাথে যুক্ত একটি সূত্রের সমতুল্য এবং (খ) অনেক প্ল্যাটফর্মে পোর্ট করা যায়।


যেমন একটি সূত্র পাওয়ার জন্য পারস্পরিক গ্রন্থিচ্যুত দলে সম্ভাবনার ভেঙ্গে দুটি উপায়ে কত চিঠি অনুযায়ী না শব্দ তাক মধ্যে নির্বাচন করা হয় (এই হোক ) এবং কত ওয়াইল্ডকার্ড (খালি) নির্বাচন করা হয় অনুযায়ী ( এই ডাব্লু হতে দিন )। যখন আছে = 7 তাক মধ্যে টাইল, এন প্রাপ্তিসাধ্য টাইল, এম কথার ব্যাপার নয় অক্ষর সাথে উপলব্ধ টাইলস, এবং ওয়াট = 2 প্রাপ্তিসাধ্য ঐ খালি, কর্তৃক প্রদত্ত সম্ভব পছন্দের সংখ্যা ( মি , W ) হয়mwr=7NMW=2(m,w)

(Mm)(Ww)(NMWrmw)

কারণ শব্দহীন অক্ষর, ফাঁকা এবং শব্দের বর্ণগুলির পছন্দগুলি ( এম , ডাব্লু , আর ) উপর স্বতন্ত্র শর্তসাপেক্ষ (m,w,r).

যখন টাইলস শব্দ চিঠি প্রতিনিধিত্বমূলক থেকে মাত্র নির্বাচন করার সময় একটি শব্দ বানান উপায়ে সংখ্যা খোঁজার জন্য সমস্যা কমে প্রদত্ত যে ঐ খালি উপলব্ধ এবং হয় - মি - W টাইল নির্বাচিত করা হবে। পরিস্থিতি অগোছালো এবং কোনও বদ্ধ সূত্র উপলব্ধ বলে মনে হচ্ছে না। উদাহরণস্বরূপ, ডাব্লু = 0 ফাঁকা এবং এম = 3 -এর বাইরে শব্দগুলি আঁকলে "বুট" বানান করতে অবশ্যই চারটি অক্ষর থাকবে যা "বি", "ও" এবং "টি" টাইল থেকে আঁকা ছিল । এখানে 2 "বি" এর, 8 "ও" এর গুলি এবং 6 রয়েছেwrmww=0m=3286স্ক্র্যাবল টাইল সেটটিতে "টি" এর অঙ্কন (মাল্টিসেট) "বিবু", "বিবিট", "বিবিটিটি", "বুও", "বুট", "বোতল", "বিটিটি", "oooo এর ইতিবাচক সম্ভাবনা রয়েছে "," ooot "," আউট "," আউট "এবং" tttt ", তবে এই বানানের মধ্যে একটি" বুট "। আর এটাই ছিল সহজ ঘটনা! উদাহরণস্বরূপ, ধরুন র্যাকটিতে "ও", "বি", এবং "টি" টাইল থেকে এলোমেলোভাবে পাঁচটি টাইল বেছে নেওয়া হয়েছে, উভয় ফাঁকা সহ একসাথে "বুট" বানানের আরও অনেক উপায় রয়েছে - এবং এটি বানান না করে। উদাহরণস্বরূপ, "বুট" "" __ বুট "এবং" __bbttt "থেকে বানান করা যেতে পারে তবে" __tttt "থেকে নয়।

এই গণনা - সমস্যার হৃদয় - পুনরাবৃত্তির সাথে পরিচালনা করা যায়। আমি একটি উদাহরণ দিয়ে বর্ণনা করব। ধরা যাক আমরা "বি", "ও", এবং "টি" টাইলগুলির সংগ্রহ থেকে একটি ফাঁকা এবং আরও চারটি টাইল দিয়ে "বুট" বানান করার উপায়গুলি গণনা করতে চাই (যেখানে দুটি দুটি টাইলই ফাঁকা অক্ষর দেখায় না { "বি", "ও", "টি"।)। "বি" প্রথম অক্ষরটি বিবেচনা করুন:

  1. একটি "বি" আঁকা যেতে পারে (21) দুটি "বি" টাইল উপলব্ধ ways এটি "ও" এবং "টি" টাইলসের সংগ্রহ থেকে দুটি ফাঁকা এবং আরও তিনটি টাইল ব্যবহার করে প্রত্যয় "উট" এর বানানগুলির সংখ্যা গণনা করার ক্ষেত্রে সমস্যাটি হ্রাস করে।

  2. একটি ফাঁকা একটি "খ" হিসাবে মনোনীত করা যেতে পারে। এটি "ওট" এবং "টি" টাইলসের সংগ্রহ থেকে অবশিষ্ট ফাঁকা এবং মাত্র তিনটি টাইল ব্যবহার করে বানান "ওট" এর বিভিন্ন পদ্ধতি গণনা করতে সমস্যা হ্রাস করে।

সাধারণভাবে, পদক্ষেপগুলি (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 ডাটা স্ট্রাকচার মধ্যে একটি প্রদত্ত শব্দ পরিবর্তন করে, এবং সঞ্চালিত এবং W । এখানেই দ্বিপদী সহগ ( এম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)))
}

আসুন আমরা এই সমাধানটি চেষ্টা করে দেখি এবং যাওয়ার সময়টি এটি সময় করে দেয়। নিম্নলিখিত পরীক্ষায় @ রসমাস বাথ সিমুলেশনগুলিতে নিযুক্ত একই উপকরণগুলি ব্যবহার করে :

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 প্রাপ্ত আমার অন্যান্য জবাব (যা একটি অধিক শক্তিশালী কাঠামো একটি সিম্বলিক বীজগণিত কম্পিউটিং প্ল্যাটফর্ম প্রয়োজন একটি অনুরূপ পদ্ধতি কিন্তু এটা আসনে ব্যবহার করে)। চারটি শব্দের জন্য সম্ভাব্যতা (তার কম সম্ভাবনা কারণে যেটি "প্রাণিবিদ্যা" জন্য একটি সঠিক মান দেবে বলে আশা করা যায়নি যুক্তিসঙ্গতভাবে বাথ সিমিউলেশানে কাছাকাছি 11840 / 16007560800 , যা লাখে একজন কম)।114327888/160075608002381831/33349085011840/16007560800,


দুর্দান্ত এবং মার্জিত সমাধান! এবং আমার থেকে অনেক দ্রুত ... :)
রাসমুস বুথ

1
এটি একটি দুর্দান্ত উত্তর, ধন্যবাদ। আপনার অ্যালগরিদমের কোডিং করতে আমার বেশ কষ্ট হত, তাই কোড ব্যবহারের জন্য প্রস্তুতটি অত্যন্ত স্বাগত। আমি জানতাম না Rতবে তবুও আপনার ফাংশনগুলি এক ঘণ্টারও কম কাজের ক্ষেত্রে ব্যবহার করতে সক্ষম হয়েছি , যাতে স্ক্রিপ্টটি 20k শব্দের অভিধান ফাইল থেকে ইনপুট নেয় এবং ফলাফলকে .csv এ লিখতে পারে। (এটি মিড-রেঞ্জের কোর আই 5-এর চেয়ে 10 মিনিটেরও কম সময় নিয়েছে)
সাবস্টিয়ান

16

রেফারেন্সযুক্ত প্রশ্নের উত্তরগুলি এখানে সরাসরি প্রয়োগ হয়: কেবলমাত্র লক্ষ্য শব্দের (এবং এটির সম্ভাব্য ওয়াইল্ডকার্ড বানান) নিয়ে একটি অভিধান তৈরি করুন, একটি এলোমেলো র্যাক লক্ষ্য তৈরি করতে না পারার সুযোগটি গণনা করুন এবং এটি থেকে বিয়োগ করুন । এই গণনাটি দ্রুত।1

সিমুলেশনগুলি (শেষে দেখানো হয়েছে) গণিত উত্তরগুলি সমর্থন করে।


বিস্তারিত

পূর্ববর্তী উত্তরের মতো, গণনা সম্পাদন করতে গণিত ব্যবহৃত হয়।

  1. সমস্যাটি উল্লেখ করুন: শব্দটি (বা শব্দগুলি, যদি আপনি চান), অক্ষরগুলি, তাদের সংখ্যা এবং র্যাক আকার size যেহেতু শব্দের মধ্যে সমস্ত অক্ষর একই রকম আচরণ করে না, এটি একক চিহ্ন দ্বারা প্রতিস্থাপনের পক্ষে গণনার গতি বাড়িয়ে তোলে - "শব্দটিতে নয় এমন কোনও অক্ষর" উপস্থাপন করে।χ

    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

চুক্তিটি ঠিক আছে, গণ্যমানের ফলাফলকে দৃ strongly়ভাবে সমর্থন করে।

ফলাফল 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

সুতরাং এটি একটি মন্টি কার্লো সমাধান, এটি হ'ল আমরা টাইলগুলি অঙ্কন করতে যাচ্ছি কয়েক মিলিয়ন বার এবং তারপরে আমরা গণনা করতে যাচ্ছি যে এই সিমুলেটেড ড্রগুলির ফলে আমাদের ফলস্বরূপ প্রদত্ত শব্দটি তৈরি করতে সক্ষম হয়েছিল। আমি সমাধানটি আরে লিখেছি, তবে আপনি অন্য কোনও প্রোগ্রামিং ভাষা ব্যবহার করতে পারেন, পাইথন বা রুবি বলুন।

আমি প্রথম বর্ণনা করতে যাচ্ছি কিভাবে একটি অঙ্কন অনুকরণ করতে হয়। প্রথমে টাইল ফ্রিকোয়েন্সি সংজ্ঞায়িত করা যাক।

# 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

এই বিশেষ ক্ষেত্রে আমরা যদিও তা করি নি ... এখন আমাদের কেবল এটি বহু বার পুনরাবৃত্তি করা এবং সফল অঙ্কনের শতাংশ গণনা করা দরকার। এই সমস্ত নিম্নলিখিত আর ফাংশন দ্বারা সম্পন্ন হয়:

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
@ হুবুহু আপনি ঠিক বলেছেন, নির্দেশ করার জন্য ধন্যবাদ! এখন এটি কাজ করছে এবং ফলাফল হিসাবে আপনার কোড হিসাবে একই উত্তর!
রাসমাস বুথ

এই সুন্দর কাজের জন্য ধন্যবাদ। প্রকৃতপক্ষে একটি মন্টি কার্লো পদ্ধতির পুরোপুরি উপযুক্ত। তবে, প্রধানত পারফরম্যান্সের কারণে, আমি হুইবার দ্বারা সরবরাহ করা সঠিক গণনা অ্যালগরিদম ব্যবহার করতে বেছে নিয়েছি।
সাবাসতিয়েন

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

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.