「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > コンピューターの乱数は本当にランダムですか? JSバージョン

コンピューターの乱数は本当にランダムですか? JSバージョン

2025-04-13に投稿されました
ブラウズ:359

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

pseudo-random numberジェネレーター(prngs)

math.random()によって提供される「ランダム性」は本当にランダムではありません。それは擬似ランダムです。 擬似ランダム数ジェネレーター(PRNG)は数学的アルゴリズムを使用して、ランダムな動作を示す数字のシーケンスを作成します。

prngsの重要な特性:

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

math.random()は通常、XorshiftやMersenne Twisterなどのアルゴリズムを使用します(正確なアルゴリズムは、ChromeのV8などのJavaScriptエンジンに依存します)。

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

math.random()

math.random()

はJavaScriptの主要な乱数ジェネレーターです。 次のように機能します: 0(包括的)と1(排他)の間の浮動小数点数を生成します。

例には、0.2315601941492、0.6874206142281、または0.9912760919023。


// 0から1の間の乱数 console.log(math.random()); // 0〜9の間のランダム整数 console.log(math.floor(math.random() * 10)); // 1〜100の乱数 console.log(math.floor(math.random() * 100)1);

// 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);

の内側の仕組み プロセスにはこれらの手順が含まれます:

初期シード値が使用されます。 この種子は、多くの場合、システムクロックまたは別のユニークなソースから派生しています。

    アルゴリズムは、数学的変換をシードに適用して、新しい数値を作成します。
  1. この新しい数値は、大きな定数(0から1の間の正規化の場合)で割られます。
  2. このプロセスは、
  3. math.random()
  4. への呼び出しごとに繰り返され、シーケンスで次の数値を生成します。
  5. この予測可能なシーケンス(種子を与えられた)により、シミュレーションやゲームに適していますが、暗号化アプリケーションには適していません。
  6. なぜ真のランダム性がとらえどころのないままであるのか

math.random()

の決定論的アルゴリズムは、種子とアルゴリズムがわかっている場合、そのシーケンスが再現可能であることを意味します。 暗号化などのセキュリティに敏感なタスクの場合、暗号化された乱数は不可欠であり、Web Crypto APIを使用して生成されます。

//暗号化的にランダム値を保護します const array = new Uint32Array(5); window.crypto.getRandomValues(配列); console.log(array);

決定論的システムにおけるランダム性の課題
// Cryptographically secure random values
const array = new Uint32Array(5);
window.crypto.getRandomValues(array);
console.log(array);

コンピューターのバイナリの性質(0Sおよび1)は、ランダム性の固有の不確実性と衝突します。 ランダム性を効果的にシミュレートするには:

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

外部出典:

システムは、種子値に予測不可能な外部データ(マウスの動き、キーストローク、システムクロック)を使用することがよくあります。

    エントロピープール:
  1. オペレーティングシステムはエントロピープールを維持し、さまざまなソースからノイズを収集してランダム性を高める。
  2. 結論:必要な幻想
  3. コンピューターのランダム性は、洗練されたアルゴリズムと初期シードに依存する慎重に構築された幻想です。 math.random()
  4. は多くのアプリケーションで実用的ですが、その制限と決定論的な性質を認めなければなりません。 セキュリティと真のランダム性には、暗号化方法が必要です。

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

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3