ホームページ ウェブフロントエンド jsチュートリアル JSランダムシャッフルアルゴリズム配列ランダムソート_JavaScriptスキル

JSランダムシャッフルアルゴリズム配列ランダムソート_JavaScriptスキル

May 16, 2016 pm 03:08 PM

推奨読書: JavaScript 学習ノート: 配列の追加、削除、変更、チェック

JavaScript 学習メモ Array Sum メソッド

JavaScript 学習ノート配列のランダム並べ替え

シャッフル アルゴリズムは比較的鮮明な用語であり、基本的に配列内の要素をランダムに配置することを可能にします。たとえば、以下の図に示すような配列があります。配列の長さは 9 で、配列内の要素の値は 1 ~ 9 です。

上記の配列から始めて、配列内の要素の順序を乱す必要があります。


コードの実装

ウィキペディアのフィッシャー・イェーツ シャッフル エントリでは、シャッフル アルゴリズムについて詳しく説明しています。以下に示すアルゴリズムも理論に基づいて作成されています。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

Array.prototype.shuffle = function() {

var input = this;

for (var i = input.length-1; i >=0; i--) {

var randomIndex = Math.floor(Math.random()*(i+1));

var itemAtIndex = input[randomIndex];

input[randomIndex] = input[i];

input[i] = itemAtIndex;

}

return input;

}

var tempArray = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]

tempArray.shuffle();

// and the result is...

alert(tempArray);

ログイン後にコピー
上記のコードでは、配列内の要素をランダムに配置するために使用される shffle() メソッドを作成しました。さらに、このメソッドを Array オブジェクトのプロトタイプの下にマウントしたので、どの配列でもこのメソッドを直接呼び出すことができます。

1

2

var tempArray = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]

tempArray.shuffle();

ログイン後にコピー

仕組み コードを読んだ後、それが配列に何を行うかを見てみましょう。まず、このメソッドは配列の最後の要素を選択します:

次に、配列の最初の要素から前のステップで選択した要素まで、すべてがこの範囲に属する、ランダムな要素を選択する範囲を決定します。

範囲を決定したら、ランダムに選択された要素が 4 であると仮定して、その範囲から数値をランダムに選択します。

次に、最後の要素とランダムに選択された要素の値を交換します:

上記の交換が完了すると、配列の最後の要素のランダム処理が完了したことになります。次に、配列内の最後から 2 番目の要素を選択します:

後ろから前に処理する理由は、ランダムに選択する範囲を決定しやすいためです。今回はランダムに取得した要素が 2: であると仮定します。

最後から2番目の要素と2番目の要素の値を交換して、最後から2番目の要素のランダムな配置が完成します。次に、最後から 3 番目の要素を選択し、前の操作を繰り返します:

残りは繰り返しの作業なので、あまり紹介しません。

コードを分析しています

前のセクションでは、図を使用してシャッフル プロセスを説明しました。次に、コード自体からシャッフル プロセスを見てみましょう。シャッフル機能から始めましょう:

シャッフル関数は Array オブジェクトのプロトタイプの下にマウントされているため、配列から関数を直接呼び出すことが簡単になります。シャッフル関数内で、これはシャッフルが呼び出される配列を指します:

1

2

3

4

5

6

7

8

9

10

Array.prototype.shuffle = function() {

var input = this;

for (var i = input.length-1; i >=0; i--) {

var randomIndex = Math.floor(Math.random()*(i+1));

var itemAtIndex = input[randomIndex];

input[randomIndex] = input[i];

input[i] = itemAtIndex;

}

return input;

}

ログイン後にコピー

上記のコードでは、新しい変数でこれを参照しています。これは、シャッフル関数が呼び出される配列です。次に、for ループ内で何が行われるかを見てみましょう:

1

var input = this;

ログイン後にコピー

このループは、すべての配列内のすべての要素を反復処理し、ランダムな交換を実行するために使用されます。走査順序は後ろから前、つまり位置 input.length-1 の要素から始まり、配列内の最初の要素が走査されるまでであることに注意してください。トラバース中の位置は変数 i で指定されます。

1

2

3

4

5

6

for (var i = input.length-1; i >=0; i--) {

var randomIndex = Math.floor(Math.random()*(i+1));

var itemAtIndex = input[randomIndex];

input[randomIndex] = input[i];

input[i] = itemAtIndex;

}

ログイン後にコピー
ここでの変数 i は、上の凡例で選択された要素です:

シャッフルアルゴリズム

次に、2 行のコードを使用して、指定された範囲内のランダムな要素を選択します。

变量 randomIndex 存储了一个随机数,该随机数可以用作数组的索引,进而提取一个随机元素。注意,该随机数的最大值并不是数组的长度,而是变量 i 的值。

确定了随机元素的索引之后,用新的变量保存该元素的值,然后交换选中元素和随机元素的值:

1

2

3

var itemAtIndex = input[randomIndex];

input[randomIndex] = input[i];

input[i] = itemAtIndex;

ログイン後にコピー

在这三行代码中,第一行使用新的变量保存了随机元素的值;第二行将选中元素 input[i] 的值赋给随机元素 input[randomIndex];第三行就随机元素的值 itemAtIndex 赋给选中元素 input[i]。本质上是一个互换两个元素的值的过程,并不难理解。

至此,循环内的逻辑就介绍完了,剩下的都是重复操作。

随机性测试


上图是使用 Highcharts 制作的随机性测试图表,以可视化的方式校验本文中洗牌算法的随机性。每次刷新页面都会重新计算和生成该图表。

生成上图的数据是这样计算而来的:首先创建一个数组(上图使用的数组为 [0, 1, 2 ... 18, 19, 20]),然后使用本文中的洗牌算法重新排序,排序完成后记录每一个元素的值……以此步骤执行 100000 次,最后对同一索引位置上的数值进行求和。如此执行 10000 次之后,索引之间的总值应该相差不大。

由计算可得:

以上内容是小编给大家介绍的JS随机洗牌算法之给数组随机排序的相关叙述,希望对大家有所帮助!

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

フロントエンドのサーマルペーパーレシートのために文字化けしたコード印刷に遭遇した場合はどうすればよいですか? フロントエンドのサーマルペーパーレシートのために文字化けしたコード印刷に遭遇した場合はどうすればよいですか? Apr 04, 2025 pm 02:42 PM

フロントエンドのサーマルペーパーチケット印刷のためのよくある質問とソリューションフロントエンド開発におけるチケット印刷は、一般的な要件です。しかし、多くの開発者が実装しています...

誰がより多くのPythonまたはJavaScriptを支払われますか? 誰がより多くのPythonまたはJavaScriptを支払われますか? Apr 04, 2025 am 12:09 AM

スキルや業界のニーズに応じて、PythonおよびJavaScript開発者には絶対的な給与はありません。 1. Pythonは、データサイエンスと機械学習でさらに支払われる場合があります。 2。JavaScriptは、フロントエンドとフルスタックの開発に大きな需要があり、その給与もかなりです。 3。影響要因には、経験、地理的位置、会社の規模、特定のスキルが含まれます。

javascriptの分解:それが何をするのか、なぜそれが重要なのか javascriptの分解:それが何をするのか、なぜそれが重要なのか Apr 09, 2025 am 12:07 AM

JavaScriptは現代のWeb開発の基礎であり、その主な機能には、イベント駆動型のプログラミング、動的コンテンツ生成、非同期プログラミングが含まれます。 1)イベント駆動型プログラミングにより、Webページはユーザー操作に応じて動的に変更できます。 2)動的コンテンツ生成により、条件に応じてページコンテンツを調整できます。 3)非同期プログラミングにより、ユーザーインターフェイスがブロックされないようにします。 JavaScriptは、Webインタラクション、シングルページアプリケーション、サーバー側の開発で広く使用されており、ユーザーエクスペリエンスとクロスプラットフォーム開発の柔軟性を大幅に改善しています。

JavaScriptを使用して、同じIDを持つArray要素を1つのオブジェクトにマージする方法は? JavaScriptを使用して、同じIDを持つArray要素を1つのオブジェクトにマージする方法は? Apr 04, 2025 pm 05:09 PM

同じIDを持つ配列要素をJavaScriptの1つのオブジェクトにマージする方法は?データを処理するとき、私たちはしばしば同じIDを持つ必要性に遭遇します...

Shiseidoの公式Webサイトのように、視差スクロールと要素のアニメーション効果を実現する方法は?
または:
Shiseidoの公式Webサイトのようにスクロールするページを伴うアニメーション効果をどのように実現できますか? Shiseidoの公式Webサイトのように、視差スクロールと要素のアニメーション効果を実現する方法は? または: Shiseidoの公式Webサイトのようにスクロールするページを伴うアニメーション効果をどのように実現できますか? Apr 04, 2025 pm 05:36 PM

この記事の視差スクロールと要素のアニメーション効果の実現に関する議論では、Shiseidoの公式ウェブサイト(https://www.shisido.co.co.jp/sb/wonderland/)と同様の達成方法について説明します。

JavaScriptは学ぶのが難しいですか? JavaScriptは学ぶのが難しいですか? Apr 03, 2025 am 12:20 AM

JavaScriptを学ぶことは難しくありませんが、挑戦的です。 1)変数、データ型、関数などの基本概念を理解します。2)非同期プログラミングをマスターし、イベントループを通じて実装します。 3)DOM操作を使用し、非同期リクエストを処理することを約束します。 4)一般的な間違いを避け、デバッグテクニックを使用します。 5)パフォーマンスを最適化し、ベストプラクティスに従ってください。

フロントエンド開発でVSCodeと同様に、パネルドラッグアンドドロップ調整機能を実装する方法は? フロントエンド開発でVSCodeと同様に、パネルドラッグアンドドロップ調整機能を実装する方法は? Apr 04, 2025 pm 02:06 PM

フロントエンドのVSCodeと同様に、パネルドラッグアンドドロップ調整機能の実装を調べます。フロントエンド開発では、VSCODEと同様のVSCODEを実装する方法...

Console.log出力の違い結果:なぜ2つの呼び出しが異なるのですか? Console.log出力の違い結果:なぜ2つの呼び出しが異なるのですか? Apr 04, 2025 pm 05:12 PM

Console.log出力の違いの根本原因に関する詳細な議論。この記事では、Console.log関数の出力結果の違いをコードの一部で分析し、その背後にある理由を説明します。 �...

See all articles