序文
フロントエンドの開発、特にゲーム開発では、乱数がよく使用されるため、 Math.random 、次のコードを見てみましょう。
for(var i = 0; i <10; i ++){document.writeln(math.random()+<br />); }上記のコードを実行すると、10の異なる数値が生成されます。もちろん、より多くを生成することができますが、これはかなり見栄えが良いです。それがすべてであれば、この記事を書く必要はありません。
例
それについて考えてみてください。特定のシナリオでゲームを作成し、ユーザーがプレイの途中で終了して、ユーザーが次回に来るときに以前の進捗状況を継続することを選択できるようにした場合、問題は今で本当に不必要です。
したがって、ランダムシード数が表示されます。要素がキャンバスにランダムに描画されたときにシード値がある場合、ページ上のすべての要素の位置、サイズなどがこのシードに基づいて計算される場合、2番目の図面が描画される場合、以前に未完成のキャンバス要素を再現するためにこのシードを通過するだけです。
その後、この時点で、JSに付属するMath.randomがうまく機能しておらず、ニーズを満たすことができないことがわかります。このコードを見てみましょう。
コードコピーは次のとおりです。
Math.seed = 5; Math.seedrandom = function(max、min){max = max || 1; min = min || 0; math.seed =(math.seed * 9301 + 49297)%233280; var rnd = math.seed / 233280.0; MIN + RND *(MAX -MIN)を返します。 }; for(var i = 0; i <10; i ++){document.writeln(math.seedrandom()+<br />); }
上記のコードを実行すると、種子数学が変更されていない場合、生成された乱数が変わらないことがわかります。ああ、この関数が導入された場合、ゲームシーンを再現することができます。詳細は必要ですが、メカニズムを保証できます。この記事の焦点は、そのようなゲームを実装することではありません。
この記事の焦点は次のとおりです。(Math.seed * 9301 + 49297)%233280 、なぜこれら3つの値が他ではないのか、そしてこれらの3つの数字にはどのような神秘的な起源がありますか?
Math.seedrandomのような擬似ランダム数ジェネレーターは、線形合同ジェネレーター(LCG、線形合同ジェネレーター)と呼ばれます。ランタイムライブラリが提供するほぼすべてのランドは、LCGを使用しています。
i n+1 = ai n+c(mod m)
生成された擬似ランダム数シーケンスの最大期間mは0〜M-1です。この最大サイクルを達成するには、会う必要があります。
1.CとMは相互に排他的です
2.a -1は、mのすべての主要な要因で分割できます
3。Mが4の倍数である場合、A -1は4の倍数でなければなりません
上記の3つは、Hull-Dobell定理と呼ばれます。擬似ランダム数ジェネレーターとして、サイクルが十分に大きくない場合、立ち往生するのは恥ずかしいので、これは要件の1つです。したがって、以下は次のとおりです。A= 9301、C = 49297、M = 233280。上記の3つの項目はすべて満たされています。
要約します
上記は、JSに種子乱数を実装および機能させる方法の紹介です。 JavaScriptの学習者に役立つことを願っています。