0

私は、CoffeeScript:Accelerated JavaScript Developmentという本を読んでいる経験の浅いJavaScriptユーザーです。この本では、著者が一種のScrabbleアプリ(5 x 5グリッドのScrabble単語を使用)を作成して、実際の概念のいくつかを示しています。以下の方法で少し問題がありrandomLetterます。これらの点を参照して、誰かが以下のコードスニペットを説明できますか?

i)作者はx = 1そうしますが、xに文字を割り当てているようx += tileCounts[letter]です。なぜそうするのですか?

ii)(i)で想定していることとは反対に、彼がxに文字ではなく番号を割り当てている場合、「文字」が実際に各文字に関連付けられた番号を表すとどのように機能しますか?

iii)ここに表示されている内容に基づいて、randomNumberより大きい場合にのみxを返す理由を理解できますか?この質問に答えるのに十分な情報がここにないかもしれないと思いますが、ある場合は説明してください

tileCounts =
  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

totalTiles = 0
totalTiles += count for letter, count of tileCounts
alphabet = (letter for letter of tileCounts).sort()

randomLetter = ->  
  randomNumber = Math.ceil Math.random() * totalTiles
  x = 1
  for letter in alphabet
    x += tileCounts[letter]
    return letter if x > randomNumber
#END:moduleVars
4

1 に答える 1

2

randomLetter()わかりにくいのは同意。本の著者として、はっきりさせておきましょう。

純粋な JavaScript で利用できるランダム性の唯一の形式は でMath.random()、これは 0 から 1 の間の数値を返します。したがって、 の考え方は、randomLetter()その乱数をランダムな文字に変換することです。各文字は、その文字のスクラブル タイルの数。

シミュレートしているものをより正確に類推するために、 から までに並べ替えられたすべてのスクラブル タイルのスタックを想像し"A""Z"ください。あとは、次のことを行うだけです。

  1. の出力Math.random()(範囲は0まで1) を 範囲0totalTiles(タイル スタックのサイズ) のものに変換し、 に割り当てますrandomNumber
  2. randomNumber- 番目のタイルに到達するまでスタックを調べ、その文字を返します。

後から考えると、最初にすべてのタイルの配列を作成し、そこからランダムな値を引き出すという、より文字通りその類推に従うように、この関数を作成する必要があったでしょう。代わりに、間接的なアプローチを選択しました。アルファベットの文字を繰り返し、その文字ですべてのタイルを描画し、「randomNumberまだタイルを描画しましたか? もしそうなら、ランダムな文字に到達しました.」

簡単に言えば、xはスタックから描画されたタイルの数を表し"A"ます"B"

それが役立つことを願っています!

于 2012-05-13T03:22:39.680 に答える