84669 人が学習中
152542 人が学習中
20005 人が学習中
5487 人が学習中
7821 人が学習中
359900 人が学習中
3350 人が学習中
180660 人が学習中
48569 人が学習中
18603 人が学習中
40936 人が学習中
1549 人が学習中
1183 人が学習中
32909 人が学習中
次のような配列があります:
var arr1 = ["a", "b", "c", "d"];
ランダム化/シャッフルするにはどうすればよいですか?
これは、Fisher-Yates の最適化されたバージョンであるDurstenfeld shuffleの JavaScript 実装です:
これは、トランプのデッキからランダムに選択するのと同じように、元の配列要素ごとにランダムな要素を選択し、次の描画から除外します。
この賢い削除方法は、選択された要素を現在の要素と交換し、残りの要素から次のランダムな要素を選択し、最適な効率で逆方向にループし、ランダムな選択が確実に単純化されるようにします (常に 0 から開始できます)。したがって、最後の要素がスキップされます。
アルゴリズムの実行時間はO(n)です。このシャッフルはその場で実行されるため、元の配列を変更したくない場合は、最初に.slice(0)メソッドを使用してコピーを作成してください。 。
O(n)
.slice(0)
新しい ES6 では、2 つの変数を同時に割り当てることができます。これは、1 行のコードで実行できるため、2 つの変数の値を交換する場合に特に便利です。これは、この機能を使用する同じ関数の短縮形です。
実際、不偏シャッフル アルゴリズムはFisher-Yates (Knuth としても知られる) シャッフル アルゴリズムです。
ここで素晴らしいビジュアライゼーションをご覧いただけます(元の投稿ここにリンクされています)
これは、Fisher-Yates の最適化されたバージョンであるDurstenfeld shuffleの JavaScript 実装です:
リーリーこれは、トランプのデッキからランダムに選択するのと同じように、元の配列要素ごとにランダムな要素を選択し、次の描画から除外します。
この賢い削除方法は、選択された要素を現在の要素と交換し、残りの要素から次のランダムな要素を選択し、最適な効率で逆方向にループし、ランダムな選択が確実に単純化されるようにします (常に 0 から開始できます)。したがって、最後の要素がスキップされます。
アルゴリズムの実行時間は
O(n)
です。このシャッフルはその場で実行されるため、元の配列を変更したくない場合は、最初に.slice(0)
メソッドを使用してコピーを作成してください。 。編集:ES6/ECMAScript 2015 に更新されました
新しい ES6 では、2 つの変数を同時に割り当てることができます。これは、1 行のコードで実行できるため、2 つの変数の値を交換する場合に特に便利です。これは、この機能を使用する同じ関数の短縮形です。
リーリー実際、不偏シャッフル アルゴリズムはFisher-Yates (Knuth としても知られる) シャッフル アルゴリズムです。
ここで素晴らしいビジュアライゼーションをご覧いただけます(元の投稿ここにリンクされています)