あなたの質問に対する単純な答えは、ルール#2に違反するということMath.random()
です。
ここでの他の多くの答えは、の存在がMath.random()
この機能が純粋ではないことを意味することを指摘しました。しかし、なぜ Math.random()
それを使用する関数を汚染するのかを言う価値があると思います。
すべての疑似乱数ジェネレータと同様にMath.random()
、「シード」値で始まります。次に、その値を一連の低レベルのビット操作またはその他の操作の開始点として使用し、予測できない(実際にはランダムではない)出力を生成します。
JavaScriptでは、関連するプロセスは実装依存であり、他の多くの言語とは異なり、JavaScriptはシードを選択する方法を提供しません。
実装は、乱数生成アルゴリズムの初期シードを選択します。ユーザーが選択またはリセットすることはできません。
このため、この関数は純粋ではありません。JavaScriptは基本的に、ユーザーが制御できない暗黙の関数パラメーターを使用しています。他の場所で計算および保存されたデータからそのパラメーターを読み取るため、定義のルール#2に違反します。
これを純粋な関数にしたい場合は、ここで説明する代替の乱数ジェネレータの1つを使用できます。そのジェネレータを呼び出しますseedable_random
ます。1つのパラメーター(シード)を取り、「ランダムな」数値を返します。もちろん、この数はまったくランダムではありません。種によって一意に決定されます。これが純粋な関数である理由です。の出力はseedable_random
、入力に基づいて出力を予測することが困難であるという意味で「ランダム」です。
この関数の純粋なバージョンは、3つのパラメーターをとる必要があります。
function test(min, max, seed) {
return seedable_random(seed) * (max - min) + min;
}
与えられたトリプルの (min, max, seed)
パラメーターに対して、これは常に同じ結果を返します。
あなたがの出力たい場合がありますseedable_random
することが真にランダムに、あなたは種をランダム化する方法を見つける必要があると思います!また、関数の外部のソースから情報を収集する必要があるため、使用した戦略は必ず純粋ではありません。以下のようmtraceurとjpmc26私を思い出させる、これはすべての物理的なアプローチが含まれます。ハードウェア乱数生成器を、レンズキャップでWebカメラ、大気中のノイズコレクター -でも溶岩ランプ。これらはすべて、関数の外部で計算および保存されたデータの使用を伴います。
Math.random()
RNGの状態を変更することを呼び出します。