2015-10-17 14 views
5

私は解決できないような問題に遭遇しました。以下のコードをご覧ください:Javascriptコードは正常に動作しています...ほとんど常に

<script> 
    function createFunctions() { 
     var first = ["", "", ""]; 
     var second = ["", "", ""]; 
     var func = ["", ""]; 
     var sign = ["", ""]; 
     for (i = 0; i < 3; i++) { 
      first[i] = (Math.round(Math.random() * 9) + 1); 
      second[i] = (Math.round(Math.random() * 9) + 1); 
      sign[i] = (Math.round(Math.random())); 
      if (sign[i] == "1") { 
       sign[i] = '+'; 
      } else { 
       sign[i] = '-'; 
      } 
      if (first < 2) { 
       func[i] = 'f(x) = x ' + sign[i] + ' ' + second[i] + '<p>'; 
      } else { 
       func[i] = 'f(x) = ' + first[i] + 'x ' + sign[i] + ' ' + second[i] + '<br>'; 
      } 
     } 
     for (i = 0; i < 3; i++) { 
      document.getElementById("createFunctions").innerHTML += 'Function ' + [i + 1] + ': ' + func[i]; 
     } 
     //whichFunction= 
     findAnswers(first, second, sign); 
    } 

    function findAnswers(first, second, sign, rand) { 
     var num = ["", "", ""]; 
     rand = (Math.round(Math.random() * 1)); 
     document.getElementById("findAnswers").innerHTML = 'Which <b>one (or more)</b> of these functions holds true, when plugged in with the following <b>values of x</b>? (' + [rand + 1] + ')<br>'; 
     for (i = 0; i < 3; i++) { 
      num[i] = (Math.round(Math.random() * 9)); 
     } 
     for (i = 0; i < 3; i++) { 
      ans = 0; 
      if (sign[rand] == "+") { 
       ans = [first[rand] * num[i]] + second[rand]; 
      } else { 
       ans = [first[rand] * num[i]] - second[rand]; 
      } 
      document.getElementById("findAnswers").innerHTML += [i + 1] + '. You put in a ' + num[i] + ': ' + ans + '<br>'; 
     } 
    } 
</script> 

<BODY onload=createFunctions()> 
    <b>A Machine Called Effex</b> 
    <p><input type="button" value="New Examples" onclick="history.go(0)" VALUE="Refresh"></p> 
    <p id="createFunctions"></p> 
    <p id="findAnswers"></p> 

すべてがうまくいきます。場合によっては、関数を計算するときを除いて、コードにxを掛けた後、加算(または減算)する代わりに、2番目の値を最初の値に連結するだけです。

+1

15行目で 'first [i] <2'であってはなりませんか? – mynawaz

+2

36行目と38行目の '[first [rand] * num [i]] + second [rand]'に大括弧をかっこに変更し、これらの行でparseIntを使ってオペランドをintにキャストしてみてください – mynawaz

+0

配列を変更しました'var array = [""、 ""、 "]'から 'var array = []'に空の配列を作成し、 'i'はforループ内で残りを行います。 http://jsfiddle.net/zzx5w79a/あなたの質問にこのリンクを含めることができます。私は "時々..、コードが倍増.."を見つけることができませんでした – caramba

答えて

3

[first[rand]*num[i]](first[rand]*num[i])に変更する必要があります。 []ブラケットは、1つの値(乗算の積)を持つ配列をインスタンス化しています。そして、配列に数値を追加すると、エンジンは配列を文字列にキャストし、あなたが「追加している」番号。

説明するには、以下のコードを検討してください。また、配列をインスタンス化しますが、unary + operatorを使用して数値にキャストします。これは配列ではなく数値になりますので、コードは期待どおりに動作します。

+[first[rand]*num[i]] 

次のコードをさらに詳しく説明します。それは単一要素の配列をインスタンス化しますが、[0]を付けることでその要素の(数値)値を指定します。+演算子を使用すると、エンジンは文字列にキャストされません。

[first[rand]*num[i]][0] 
+0

ありがとうございました! – Jehangir

+0

喜んでお手伝いします。解決された質問に対する適切な回答を選択することを忘れないでください。 – moismailzai

0

角括弧は、角括弧を使用していたはずです。

角括弧は配列の作成に使用されます。たとえば、[2 * 3]は、1つの項目を含む配列を作成します。さらに、+ operatorは、オペランドに応じて数値の加算または文字列の連結を行います。配列と数値を加算すると連結されます。ですから、例えば、この文:あなたは間違って使用されている角括弧を取り除く必要がある

ans = "6" + "4"; 
// string "64" 

​​

は、次のように評価されます。


これ以外にも、Math.random()の機能が正しく使用されていません。例えば、この文:

Math.round(Math.random() * 9) + 1 

は1と10の間の乱数を返すように見えるが、数字1及び10は、正しい方法は、乱数を生成するために8を介し番号2と比較して低い確率を有するであろうminmax間にある:

Math.floor(Math.random() * (max - min + 1)) + min 

最後に、この文:

rand = Math.round(Math.random() * 1); 

のみ0と1ではなく2 Yを返します。あまりにもそれを修正する必要があります。

関連する問題