2012-03-20 11 views
0

私は初心者プログラマーであり、複雑な質問のために前もって謝罪しています。Forループ内にカウンタを作成しますか?

私が画面上に提示した文字のシリーズは「単語」または「ない言葉」を作る場合は、回答者が決める必要がある実験的研究のための語彙判断タスクを作成しようとしています。すべては私がランダムに別の入力ファイル(INPUT.TXT)から80回の試験の各ワード(カテゴリーA)または非単語(カテゴリB)を選択したいビットを除いて、合理的にうまく機能します。ランダム化は機能しますが、 "round.catIndex = j;"を使用しているため、各リスト(カテゴリAまたはB)の一部の要素はスキップされます。ここで、「j」は連続する各試行のループです。いくつかの試行はカテゴリAからランダムにカテゴリBから選択するため、「j」は各カテゴリのリストを連続して移動しません。代わりに、カテゴリAのリストの要素は、1,2,5,8,9,10などのように選択できます(ランダム化のために毎回変わります)。

長いストーリー(!)を短くするには、それぞれの試行でforループ内で動作するカウンタを作成し、カテゴリAとBのすべての語句と非語句がそれぞれ使用されるようにします字句決定タスク?私がこれまでに試したことはすべて正しく動作しないか、JavaScriptを完全に破壊します。

は、以下の私のコードスニペットで、完全なコードはhttp://50.17.194.59/LDT/trunk/LDT.jsで入手可能です。また、語彙全体の決定タスクはhttp://50.17.194.59/LDT/trunk/LDT.phpでアクセスできます。ありがとう!

function initRounds() 
    { 
     numlst = []; 
     for (var k = 0; k<numrounds; k++) 
      { 
       if (k % 2 == 0) numlst[k] = 0; 
       else numlst[k] = 1; 
      } 
     numlst.sort(function() {return 0.5 - Math.random()}) 

     for (var j = 0; j<numrounds; j++) 
      {  
       var round = new LDTround(); 
       if (numlst[j] == 0) 
        { 
         round.category = input.catA.datalabel; 
        } 
       else if (numlst[j] == 1) 
        { 
         round.category = input.catB.datalabel; 
        } 

       // pick a category & stimulus 
        if (round.category == input.catA.datalabel) 
         { 
          round.itemtype = input.catA.itemtype; 
          round.correct = 1; 
          round.catIndex = j; 
         } 
        else if (round.category == input.catB.datalabel) 
         { 
          round.itemtype = input.catB.itemtype; 
          round.correct = 2; 
          round.catIndex = j; 
         }  
        roundArray[i].push(round); 
       } 
     return roundArray; 
    } 

答えて

0

あなたは複数の変数を宣言すると、単一のforループ内で複数の文を実行するためにcomma operatorを使用することができます。あなたのケースでは

、あなたのような何かを行うことができます:私はそれをより明確にするものをverbose変数名を選択しました

for(var CatAIndex = 0, CatBIndex = 0; CatAIndex+CatBIndex < numrounds; incrementA ? CatAIndex++ : CatBIndex++) { 
    // Insert your code here 
} 

を。あなたはカテゴリーAとカテゴリーBの2つの別々のインデックスを持ち、2つの合計と実行したいラウンドの数を比較します。そして、どこかforループの内側に、あなたはインクリメントするかを示すためにtrueまたはfalseのいずれかにブールincrementAを設定します。大体あなたが求めているものと一致するが、私はあなたが好む何を考えて

各リストからランダムに単語/非単語を取得するにはMath.random<array>.splice<array>.lengthの組み合わせを使用することではなく、予測可能な順序を生成します選択のために。そして、あなたもケア指数は、2つのカテゴリのためのものはありませんどのようなあなたは、ループの簡単なfor(var i = 0; i < numrounds; i++)型に戻ることができます。

後者はあなたが本当に欲しいものである場合は、この答えにコメントを残して、私は別の例でそれを更新します。

EDIT:それ以外の場合は、ユーザーが単語/非を拾う可能性があるため

さて、私は、単語と非単語の実際の数と順序が本当にあなたのテストで定義されていないと仮定しています単語のパターンとクリスマスツリーテスト。また、グローバルスコープ内に単語の2つの配列とcatAcatBという非単語があると仮定しています。以下は、以下を実行する関数です:

  1. ランダムに単語または非単語を選択します。
  2. 単語や単語以外のピックを繰り返すことはありません(技術的には、リストの最後に近いほど決定的になります)。
  3. すべての単語が使い果たされるまで、自動的にcatAcatB配列からリスト。(あなたが好きなのであれば、あなたが+infnumroundsを設定することができます。)

var pickAWord = (function outerScope() { 
    var allWords = []; 
    return function innerClosure() { 
     if(allWords.length == 0) { 
      allWords = [].concat(catA, catB); 
     } 
     return allWords.splice(Math.floor(Math.random()*allWords.length), 1)[0]; 
    }; 
})(); 

機能が機能Pを使用していますクローズの概念をプログラミングして、持続可能な「グローバルに似た」変数allWordsを作成することができます。この関数は、配列の長さがグローバルのcatAcatBを使用して(最初からそうであるように)ゼロに達すると、すべてのワードで配列を自動的にリフレッシュします。単に、forループでそれを使用するには:

for(var i = 0; i < numrounds; i++) { 
    var wordToUse = pickAWord(); 
    // Do something 
} 

をあなたはcatAcatB言葉の同じ番号が使用されていることを保証する必要がある場合は、outerScope機能は三つの変数を追跡する必要があります。catAのコピーと、 catBと同じサイズ、numroundsと同じサイズの配列、その半分はtrue、半分はfalseです。 spliceをこの真偽配列からランダムに抽出し、trueまたはfalseのいずれかに応じて、catAまたはcatBからランダムにスプライスします。次に、これらのクロージャー変数をすべて "リフレッシュ"するコードが必要になりますが、それは上の関数の記述方法と本質的に同じです。

申し訳ありません機能が少し複雑ですが、使いやすさが分かります。 :)

+0

詳細なコメントをいただきありがとうございます。あなたが推測したように、後者の提案は私がやりたいことの行に沿っています(私はそれをどうやって行うのか分かりませんでした)。例を投稿することができれば、それを自分のプログラムに追加する方法を理解できるはずです。再度、感謝します! –

+0

ねえ、私は昨夜答えたときに寝ました。私はそれを解決する方法で質問を編集しました。 –

+0

ああ、それは本当にクールです。あなたの説明は、この問題に対処する方法を理解するのに役立ちます(ついに!)。どうしたらいいのか教えてあげよう... –

0

私はあなたの問題を理解しています。

すべてのカテゴリA要素(すべてのカテゴリB要素を処理する同様のループ)を処理するには、forループを使用したいと考えています。この場合、あなたはroundArrayをループし、そのカテゴリに応じて要素を扱うことができます。

for (var j=0; j < numrounds, j++) { 
    var round = roundArray[i][j]; 
    // you might want to use a test better suiting the context if input is not available at the 
    // time when round is processed, I am using this based on the code sample you provided 
    if (round.itemType == input.catA.itemType) { 
    // process round as Category A 
    // use numlst[round.catIndex] to access the corresponding element in numlst 
    } else { 
    // process round as Category B 
    // use numlst[round.catIndex] to access the corresponding element in numlst 
    } 
} 
// alternatively, you can break the loop into two and process only Category A in one instance 
// and only Category B in the other (the if branch corresponding to the other category would be 
// empty) 

をこれはあなたの意図されていない場合、明確にしてください。

+0

提案していただきありがとうございます。彼が最初に答えたので、私はDavid Ellisの助けを使い終わった。乾杯! –

関連する問題