0

ここに、要素の数が定義されていない配列があります。この配列のランダムな要素を印刷して切り取ってみました。ここに私のコードがあります。

function rand(min, max){
   return (Math.floor(Math.random() * (max - min + 1)) + min).toFixed(0);
}
$('#do').click(function(){
    var count = chamarr.length;
    var num = 0;
    if (count == 1) {
      $('#output').html('Nothing can found');
    } else {
      num = rand(1,chamarr.length);
      $('#output').html(chamarr[num]);
      chamarr.splice(num,1);
    }
 });

配列がカットされていることをログに記録すると、それは常に問題ないことがわかりましたが、要素がカットされない場合があります。

4

3 に答える 3

7

私の推測では、問題はあなたのrandnum方法にあると思います:

function rand(min, max){
   return (Math.floor(Math.random() * (max - min + 1)) + min).toFixed(0);
}

これにより、両端[min, max]含む範囲の値が得られると思います。(実際には、文字列を返すようにその値の文字列バージョンが提供されますが、後で使用すると、強制的に数値に戻されます。)toFixed

今、あなたはそれをこのように呼んでいます:

num = rand(1,chamarr.length);

したがって、配列の長さが6要素の場合、範囲内の値を取得します[1, 6]。しかし、次に、-を取得しようとします。chamarr[num]有効なインデックスの範囲は[0, 5]、配列が0ベースであるためです。要素6を取得しようとすると、それで得られますundefinedが、要素6でスプライシングしても何も起こりません。

rand次のように、メソッドを上限で排他的に変更します。

function rand(min, max) {
   return (Math.floor(Math.random() * (max - min)) + min).toFixed(0);
}

そしてそれをこのように呼びます:

num = rand(0, chamarr.length);

これにより、インデックス作成とスプライシングの両方に適切な範囲の値が得られます。

編集:コメントなどに応じて:

  • 関数のtoFixed(0)一部を削除することはおそらく価値があります。結局のところ、文字列は本当にrand必要ありません。これは実際には以前の問題の一部ではありませんが、一般的にはよりクリーンです。

    function rand(min, max) {
       return Math.floor(Math.random() * (max - min)) + min;
    }
    
  • 0下限を暗黙的にする関数のバージョンが必要な場合もあります

  • コード内の他の場所で乱数を使用しない場合は、個別の関数を使用する代わりに/呼び出しをインライン化できますが、個人的には、取得したい「ロジック」コードからそれらを十分に遠ざけたいと思います。乱数を使用します。Math.floor()Math.random()
  • 関数を変更する理由は、排他的な上限を持つことがコンピューターサイエンスでははるかに一般的であるためです。これは通常、コレクションなどの0インデックス付けと一緒に行われます。通常for、包括的下限と排他的下限などを使用してループを記述します。
于 2012-07-07T08:20:13.363 に答える
2

問題はnum、インデックスが範囲外であるということです。これを行う必要があります:

num = rand(0, chamarr.length - 1);
于 2012-07-07T08:20:15.610 に答える
0

ロジックを簡素化できます。

function rand(max) {
  return Math.round( Math.random() * max ) % max;
}
var arr = [1, 2, 3, 4],
    len = arr.length,
    num = rand(len);

if ( len === 1 ) {
    // Do your "Nothing here" output
}
else {
    arr.splice(num, 1);
    // etc, etc, etc...
}
于 2012-07-07T08:27:05.923 に答える