0

だから私はこのスクリプトに取り組んでいます。使い終わったら、2-and-2 グループの作成に使用する必要があります。とにかく; スクリプトの先頭にある 'input' 配列は、HTML ファイルから 22 の異なる入力を取得します。目安として、1 ~ 22 の値を付けました。問題は、私の 2 つのブロック '1st number' と '2nd number' がうまく機能しないことです: それらは正しい数字を返しません。すべての elev[x] を 1 回だけ使用したいからです。2回じゃなくて0回じゃなくて1回!そして、ブロックは 2 回返されることもあれば、使用されないこともあります。では、どうすればこれを修正できますか?

    function Calculate(){
    var elev = [];
    var inputs = document.getElementsByName("txt");
    for(i=0; i<inputs.length; i++) {
    elev[i] = {
        "Value": inputs[i].value,
        "Used": false
    };
}

    function shuffle(elev){
    var len = elev.length;
    for(i=1; i<len; i++){
        j = ~~(Math.random()*(i+1)); 
        var temp = elev[i];
        arr[i] = elev[j];
        arr[j] = temp;
        }
    }

    for(var v=0; v<1; v++) {
        shuffle(elev);
        document.write(elev + '<br/>\n');
    }}

はい、私はまだプログラミングが初めてであり、私が学ぶことができることを学びたいだけです。

フィッシャーイメートのシャッフルを行うことで問題が解決しました。

4

2 に答える 2

0

乱数を一度だけ取得し、まだ使用されていない場合は処理します。

配列 ( ) をシャッフルしてelev.sort(function() {return Math.random()-0.5})から、さらに乱数を使用せずに結果を反復処理することをお勧めします。

于 2013-01-23T18:49:38.100 に答える
0

配列をシャッフルして反復処理するという考え方は正しいですが、コイン投げコンパレーターによるソート (一般的な誤実装; 他の回答で示唆されています) は、配列をシャッフルする正しい方法ではありません。非常に歪んだ結果が生成され、終了する保証さえありません。

underscore.js ( arr = _.shuffle(arr)) を取得したくない場合は、Fisher-Yates shuffle を使用することをお勧めします。

function shuffle(arr){
  var len = arr.length;
  for(var i=1; i<len; i++){
    var j = ~~(Math.random()*(i+1)); // ~~ = cast to integer
    var temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
  }
}

...

shuffle(elev);
for(var i=0; i<elev.length; i++){
  //do something with elev[i]
  console.log(elev[i].Value);
}

また、オブジェクト フィールドは大文字ではなく小文字にする必要があることに注意してください (value', not 'Value'). Also, the順番に反復するため、 Used` フィールドは必要ありません。また、値の配列を使用できる可能性はありますか? それらはオブジェクト内の唯一のフィールドのようです。

また、document.write() は使用しないでください。ページの読み込み後に使用すると、期待どおりに動作しません。ドキュメントに何かを追加したい場合、jQuery やその他のフレームワークが嫌いで、DOM ノードを作成して構成するのに長い道のりを歩きたくない場合 document.body.innerHTML +=でも、よりは優れています(ただし、代わりに s をdocument.write()追加することを検討してください)。DocumentFragment

デモ: http://jsfiddle.net/honnza/2GSDd/1/

于 2013-01-23T19:05:38.197 に答える