ホームページ > ウェブフロントエンド > jsチュートリアル > JavaScript を使用して配列内の値のインデックスをランダム化し、ランダムな配列を作成する方法の詳細な例

JavaScript を使用して配列内の値のインデックスをランダム化し、ランダムな配列を作成する方法の詳細な例

巴扎黑
リリース: 2017-09-14 11:59:11
オリジナル
1555 人が閲覧しました

この記事の例では、JavaScriptを使用して配列内の値のインデックスをランダム化し、ランダムな配列を作成する方法を説明します。皆さんの参考に共有してください。詳細は次のとおりです。

今日、QW コミュニケーション グループで、数人の学生が配列のランダム化の問題について議論しているのを見かけました。そのアルゴリズムは非常に優れており、以前に実装したあまり「美しくない」方法を思い出しました。考えてみてください。機能を実装するためだけにビジネス コードを書くのに忙しいとき、より良い実装方法があるかどうかについてあまり考えないことがあります。

この配列の問題 (配列内の値を並べ替えて新しい配列を返す) について、私の以前の実装方法は次のとおりでした:

function randArr(arr) {
 var ret = [],
 obj = {},
 i = arr.length,
 l = i,
 n;
 while (--i >= 0) {
  n = Math.floor( Math.random() * l );
  if (obj[n] === void 0) {
   ret[ret.length] = obj[n] = arr[n];
  } else {
   i++;
  }
 }
 return ret;
}
ログイン後にコピー

上記のコードは機能しますが、それは良いアルゴリズムではありません。 「元の配列の長さ」ループを実行する予定です。各ループは元の配列内のインデックスをランダムに選択し、インデックスが取得されているかどうかを判断します。取得されていない場合は、インデックスの値を新しい配列に入力します。そうであれば、デクリメントキー i が 1 だけインクリメントされます (目的は、別の未フェッチのインデックスがフェッチされるまでサイクルを繰り返すことです)。この方法のパフォーマンスはあなたの性格に依存します。このアイデアを見た学生はその理由を理解できると思います。

ここでグループ内のクラスメートのアルゴリズムを与えます:

function randArr(arr) {
 var ret = [],
 i = arr.length,
 n;
 arr = arr.slice(0);
 while (--i >= 0) {
  n = Math.floor( Math.random() * i);
  ret[ret.length] = arr.splice(n, 1)[0];
 }
 return ret;
}
ログイン後にコピー

これは、各ループの後、ランダムなインデックスが取得され、その値が配列から削除されます。このインデックスをランダムに取得すると、このインデックスは前回取得した値ではなくなり、乱数の範囲は配列の長さに応じて減少するため、一度に一定回数ループして望ましい結果を得ることができます。 。

また、改良版も見ました。これは、配列の削除操作によって引き起こされるパフォーマンスの問題を考慮し、JK のシャッフル アルゴリズムを使用しています。つまり、各削除操作を位置置換操作 (フェッチされたインデックスの値) に変更しています。は、現在のデクリメントキー i) に対応する値と交換されるため、配列全体への影響は最小限になります:

function randArr(arr) {
 var ret = [],
 i = arr.length,
 n;
 arr = arr.slice(0);
 
 while (--i >= 0) {
  n = Math.floor( Math.random() * i);
  ret[ret.length] = arr[n];
  arr[n] = arr[i];
 }
 return ret;
}
ログイン後にコピー

最後に、「min~max の間の値を持つランダムな配列を作成します。」 " " メソッドのアルゴリズム原理は上記と同様です:

function makeRandArr(min, max) {
 var ret = [],
 obj = {},
 n;
 for (; max >= min; max--) {
  n = Math.ceil( Math.random() * (max - min) ) + min;
  ret[ret.length] = obj[n] || n;
  obj[n] = obj[max] || max;
 }
 return ret;
}
ログイン後にコピー

以上がJavaScript を使用して配列内の値のインデックスをランダム化し、ランダムな配列を作成する方法の詳細な例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート