Sorunuzun basit cevabı, 2. kuralı ihlal etmektir Math.random()
.
Buradaki diğer birçok cevap Math.random()
, bu fonksiyonun saf olmadığı anlamına gelen araçların varlığına işaret etti . Ama bence lekelerin neden Math.random()
onu kullanan işlev gördüğünü söylemeye değer .
Tüm sözde rasgele sayı üreteçleri gibi, Math.random()
bir "tohum" değeriyle başlar. Daha sonra bu değeri, öngörülemeyen (ancak gerçekten rastgele olmayan ) bir çıktıyla sonuçlanan düşük seviyeli bit manipülasyonları veya diğer işlemler zinciri için başlangıç noktası olarak kullanır .
JavaScript'te, ilgili süreç uygulamaya bağlıdır ve diğer birçok dilden farklı olarak JavaScript, , tohumu seçmek için hiçbir yol sunmaz :
Uygulama, rasgele sayı üretme algoritmasının ilk tohumunu seçer; kullanıcı tarafından seçilemez veya sıfırlanamaz.
Bu işlevin saf olmasının nedeni budur: JavaScript aslında üzerinde hiçbir kontrolünüz olmayan örtük bir işlev parametresi kullanıyor. Bu parametreyi başka yerde hesaplanan ve depolanan verilerden okuyor ve bu nedenle tanımınızdaki 2. kuralı ihlal ediyor.
Bunu saf bir işlev yapmak istiyorsanız, burada açıklanan alternatif rasgele sayı üreticilerinden birini kullanabilirsiniz . Jeneratörü ara seedable_random
. Bir parametre (çekirdek) alır ve "rastgele" bir sayı döndürür. Tabii ki, bu sayı gerçekten rastgele değil; tohum tarafından benzersiz bir şekilde belirlenir. Bu yüzden bu saf bir işlevdir. Çıktı seedable_random
, girdiye dayalı olarak çıktıyı tahmin etmenin zor olması anlamında yalnızca "rastgele" dir.
Bu işlevin saf versiyonunun üç parametre alması gerekir :
function test(min, max, seed) {
return seedable_random(seed) * (max - min) + min;
}
Herhangi bir üçlü için (min, max, seed)
parametre için, bu her zaman aynı sonucu verecektir.
Eğer çıktısını isteseydi unutmayın seedable_random
olmak gerçekten rastgele, Eğer tohum rastgele bir yolunu bulmak gerekiyordu! Ve hangi stratejiyi kullanırsanız kullanın, kaçınılmaz olarak saf olmayacaktır, çünkü işlevinizin dışındaki bir kaynaktan bilgi toplamanızı gerektirecektir. As mtraceur ve jpmc26 : bana hatırlatmak, bu tüm fiziksel yaklaşımlar içeren donanım rasgele sayı üreteçleri , mercek kapakları ile kamerası , atmosferik gürültü toplayıcıları - hatta lav lambaları . Tüm bunlar, işlevin dışında hesaplanan ve saklanan verileri kullanmayı içerir.
Math.random()
RNG'nin durumunu değiştiren çağırır .