Javascript
 Computer >> コンピューター >  >> プログラミング >> Javascript

JavaScriptのフィッシャー-イェーツシャッフルとは何ですか?


フィッシャー-イェーツシャッフルアルゴリズム

このアルゴリズムは、配列内の要素をシャッフルするためのものです。配列内の要素をシャッフルするために独自のロジックを作成できますが、多くの開発者は F isher-Yates 最新のシャッフルアルゴリズムは、配列内の要素をシャッフルするための最良の方法です。このアルゴリズムには次の手順があります。

従う手順

  • このアルゴリズムによれば、配列を後ろから前にループする必要があります。たとえば、次の例では、インデックス0からインデックス7までの8つの要素(A、B、C、D、E、F、G、H)で構成される配列があります。したがって、最初のループパスは次の要素に影響します。 Hである最後のインデックス7。
  • 次のステップは、選択したインデックス7とインデックス0の間に乱数(ランダムインデックス)を生成することです。たとえば、ランダムインデックスを3とします。
  • ランダムインデックスを取得した後、選択したインデックスとランダムインデックスにある要素をスワップします。提供された配列のランダムインデックスにある要素はDです。したがって、スワップ後、配列はA、B、Cに変更されます。 、H、E、G、F、D。
  • 2番目のループパスでは、最後のインデックスを無視し(すでにループされているため)、要素AとFの間にあるインデックス0とインデックス6の間のランダムインデックスを見つけようとします。生成されたランダムインデックスを2とします。
  • ランダムインデックスを取得したら、6と2のインデックスの要素を交換しましょう。これで、配列はA、B、F、H、E、G、C、Dのようになります。
  • このアルゴリズムは、インデックス6を無視し、インデックス5とインデックス0の間のランダムなインデックスの検索を開始し、インデックス1に到達するまで同じパターンに従います。インデックスがないため、インデックス0をループさせることはできません。交換の目的で0未満。
  • 生成されたランダムインデックスがループインデックスとして選択される可能性があることに注意してください。たとえば、選択したインデックス4とインデックス0の間でループを実行します。生成されたランダムインデックスを4とします。そうすると、インデックス4の値は同じ位置に留まります。

次の例は、フィッシャー-イェーツを示しています 最新のシャッフルアルゴリズム

<html>
<body>
<script>
   var arr = ['A','B','C','D','E','F','G','H']
   var i = arr.length, k , temp;      // k is to generate random index and temp is to swap the values
   while(--i > 0){
      k = Math.floor(Math.random() * (i+1));
      temp = arr[k];
      arr[k] = arr[i];
      arr[i] = temp;
   }
   document.write(arr);
</script>
</body>
</html>

出力

C,F,H,D,A,G,E,B  // note that output will change for every iteration.

  1. JavaScriptランダム

    Math.random()関数は、0から1までの乱数を生成するために使用されます。 以下はMath.random()関数のコードです- 例 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Document

  2. JavaScript配列のランダムなアイテムを置き換えますか?

    ランダムなアイテムを置き換えるには、map()と一緒にrandom()を使用します。 例 以下はコードです- function substituteRandomValue(names, size) {    return function () {       const index = new Set();       do {          index.add(Math.floor(Math.random() * names.length));