ホームページ >ウェブフロントエンド >jsチュートリアル >コンピューターの乱数はそもそもランダムなのでしょうか? JSバージョン

コンピューターの乱数はそもそもランダムなのでしょうか? JSバージョン

Barbara Streisand
Barbara Streisandオリジナル
2025-01-18 18:29:10695ブラウズ

JavaScript のシミュレートされたランダム性を理解する: Math.random() の詳細

プログラミングにおける乱数の生成は、一見楽そうに見えますが、特にコンピューターの本質的に決定的な性質を考慮すると、その根底にある複雑さが隠蔽されることがよくあります。この記事では、JavaScript が Math.random() を使用してランダム性をシミュレートする方法を検討し、私たちが乱数として認識するものを生成する背後にある仕組みを明らかにします。

Is random numbers in computers are random at all? JS version

コンピューティングにおけるランダム性の幻想

コンピューターは、その中核で命令を順番に実行します。 では、ランダムに見える数字はどのようにして生成されるのでしょうか?

Is random numbers in computers are random at all? JS version

擬似乱数ジェネレーター (PRNG)

Math.random() によって提供される「ランダム性」は、本当にランダムではありません。それは擬似ランダムです。 擬似乱数生成器 (PRNG) は、数学的アルゴリズムを使用して、ランダムのような動作を示す一連の数値を作成します。

PRNG の主な特徴:

  1. シード値: 開始値 (シード) によって数値シーケンスが開始されます。 シードはシーケンス全体を決定します。
  2. 決定的動作: アルゴリズムとシードを知ることで、数列全体の予測が可能になります。
  3. 周期性: PRNG は、特定の反復回数の後に必然的にシーケンスを繰り返します。

JavaScript の Math.random() は通常、XorShift や Mersenne Twister などのアルゴリズムを利用します (正確なアルゴリズムは、Chrome の V8 などの JavaScript エンジンによって異なります)。

Is random numbers in computers are random at all? JS version

デコードMath.random()

Math.random() は、JavaScript の主要な乱数ジェネレーターです。 次のように機能します:

0 (両端を含む) と 1 (両端を含まない) の間の浮動小数点数を生成します。
例には、0.2315601941492、0.6874206142281、または 0.9912760919023 が含まれます。

<code class="language-javascript">// Random number between 0 and 1
console.log(Math.random());

// Random integer between 0 and 9
console.log(Math.floor(Math.random() * 10));

// Random number between 1 and 100
console.log(Math.floor(Math.random() * 100) + 1);</code>

Math.random()

の内部の仕組み

このプロセスには次の手順が含まれます:

  1. 初期シード値が使用されます。 多くの場合、このシードはシステム クロックまたは別の固有のソースから派生します。
  2. アルゴリズムは数学的変換をシードに適用して新しい数値を作成します。
  3. この新しい数値は大きな定数で除算されます (0 と 1 の間の正規化のため)。
  4. このプロセスは Math.random() を呼び出すたびに繰り返され、シーケンス内の次の番号が生成されます。

この予測可能なシーケンス (シードが与えられている) により、シミュレーションやゲームには適していますが、暗号アプリケーションには適していません。

真のランダム性が依然としてわかりにくい理由

Math.random() の決定論的アルゴリズムは、シードとアルゴリズムが既知であれば、そのシーケンスが再現可能であることを意味します。 暗号化などのセキュリティが重要なタスクには、Web Crypto API を使用して生成された、暗号的に安全な乱数が不可欠です。

<code class="language-javascript">// Random number between 0 and 1
console.log(Math.random());

// Random integer between 0 and 9
console.log(Math.floor(Math.random() * 10));

// Random number between 1 and 100
console.log(Math.floor(Math.random() * 100) + 1);</code>

決定論的システムにおけるランダム性への挑戦

Is random numbers in computers are random at all? JS version

コンピュータの 2 値の性質 (0 と 1) は、ランダム性という固有の不確実性と衝突します。 ランダム性を効果的にシミュレートするには:

  1. 外部ソース: システムは多くの場合、シード値として予測不可能な外部データ (マウスの動き、キーストローク、システム クロック) を使用します。
  2. エントロピー プール: オペレーティング システムはエントロピー プールを維持し、ランダム性を高めるためにさまざまなソースからノイズを収集します。

結論: 必要な幻想

コンピュータにおけるランダム性は、洗練されたアルゴリズムと最初のシードに依存して、慎重に構築された幻想です。 Math.random() は多くのアプリケーションにとって実用的ですが、その制限と決定論的な性質を認識する必要があります。 セキュリティと真のランダム性を実現するには、暗号化手法が必要です。

コードを駆動する決定論とシミュレートされたランダム性の間の興味深い相互作用を理解しましょう!

Is random numbers in computers are random at all? JS version

以上がコンピューターの乱数はそもそもランダムなのでしょうか? JSバージョンの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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