Die einfache Antwort auf Ihre Frage lautet, dass sie Math.random()
gegen Regel 2 verstößt.
Viele andere Antworten hier haben darauf hingewiesen, dass das Vorhandensein von Math.random()
bedeutet, dass diese Funktion nicht rein ist. Aber ich denke, es lohnt sich zu sagen, warum Math.random()
Taints-Funktionen es verwenden.
Math.random()
Beginnt wie alle Pseudozufallszahlengeneratoren mit einem "Startwert". Dieser Wert wird dann als Ausgangspunkt für eine Kette von Bitmanipulationen auf niedriger Ebene oder für andere Operationen verwendet, die zu einer unvorhersehbaren (aber nicht wirklich zufälligen ) Ausgabe führen.
In JavaScript ist der Prozess implementierungsabhängig, und im Gegensatz zu vielen anderen Sprachen bietet JavaScript keine Möglichkeit, den Startwert auszuwählen :
Die Implementierung wählt den anfänglichen Startwert für den Zufallszahlengenerierungsalgorithmus aus; Es kann vom Benutzer nicht ausgewählt oder zurückgesetzt werden.
Deshalb ist diese Funktion nicht rein: JavaScript verwendet im Wesentlichen einen impliziten Funktionsparameter, über den Sie keine Kontrolle haben. Es liest diesen Parameter aus Daten, die an anderer Stelle berechnet und gespeichert wurden, und verstößt daher gegen Regel 2 in Ihrer Definition.
Wenn Sie dies zu einer reinen Funktion machen möchten, können Sie einen der hier beschriebenen alternativen Zufallszahlengeneratoren verwenden . Nennen Sie diesen Generator seedable_random
. Es nimmt einen Parameter (den Startwert) und gibt eine "Zufallszahl" zurück. Natürlich ist diese Zahl überhaupt nicht zufällig; es wird eindeutig durch den Samen bestimmt. Deshalb ist dies eine reine Funktion. Die Ausgabe von seedable_random
ist nur "zufällig" in dem Sinne, dass es schwierig ist, die Ausgabe basierend auf der Eingabe vorherzusagen.
Die reine Version dieser Funktion müsste drei Parameter annehmen :
function test(min, max, seed) {
return seedable_random(seed) * (max - min) + min;
}
Für jedes gegebene Dreifach von (min, max, seed)
Parametern wird immer das gleiche Ergebnis zurückgegeben.
Beachten Sie, dass Sie einen Weg finden müssen, um den Startwert zufällig seedable_random
zu bestimmen , wenn die Ausgabe von wirklich zufällig sein soll! Und jede Strategie, die Sie verwendet haben, wäre unweigerlich nicht rein, da Sie Informationen aus einer Quelle außerhalb Ihrer Funktion sammeln müssten. Wie mtraceur und jpmc26 mich erinnern, umfasst dies alle physikalischen Ansätze: Hardware-Zufallszahlengeneratoren , Webcams mit Objektivdeckeln , atmosphärische Geräuschkollektoren - sogar Lavalampen . All dies beinhaltet die Verwendung von Daten, die außerhalb der Funktion berechnet und gespeichert wurden.
Math.random()
was den Status des RNG ändert.