Jawaban sederhana untuk pertanyaan Anda adalah yang Math.random()
melanggar aturan # 2.
Banyak jawaban lain di sini yang menunjukkan bahwa keberadaan Math.random()
sarana fungsi ini tidak murni. Tapi saya pikir ada baiknya mengatakan mengapa Math.random()
fungsi taints yang menggunakannya.
Seperti semua pembuat nomor pseudorandom, Math.random()
dimulai dengan nilai "seed". Kemudian menggunakan nilai itu sebagai titik awal untuk rangkaian manipulasi bit tingkat rendah atau operasi lain yang menghasilkan keluaran yang tidak dapat diprediksi (tetapi tidak benar - benar acak ).
Dalam JavaScript, proses yang terlibat bergantung pada implementasi, dan tidak seperti banyak bahasa lain, JavaScript menyediakan tidak cara untuk memilih benih :
Implementasi memilih benih awal untuk algoritma generasi nomor acak; itu tidak dapat dipilih atau diatur ulang oleh pengguna.
Itulah mengapa fungsi ini tidak murni: JavaScript pada dasarnya menggunakan parameter fungsi implisit yang tidak dapat Anda kendalikan. Ini membaca parameter itu dari data yang dihitung dan disimpan di tempat lain, dan karena itu melanggar aturan # 2 dalam definisi Anda.
Jika Anda ingin menjadikan ini fungsi murni, Anda dapat menggunakan salah satu generator nomor acak alternatif yang dijelaskan di sini . Panggil generator itu seedable_random
. Dibutuhkan satu parameter (benih) dan mengembalikan nomor "acak". Tentu saja, angka ini sama sekali tidak acak; itu secara unik ditentukan oleh benih. Itulah mengapa ini adalah fungsi murni. Keluaran dari seedable_random
hanya "acak" dalam arti sulit memprediksi keluaran berdasarkan masukan.
Versi murni dari fungsi ini perlu mengambil tiga parameter:
function test(min, max, seed) {
return seedable_random(seed) * (max - min) + min;
}
Untuk tiga kali lipat (min, max, seed)
parameter apa pun, ini akan selalu mengembalikan hasil yang sama.
Catatan bahwa jika Anda ingin output seedable_random
menjadi benar-benar acak, Anda akan perlu untuk menemukan cara untuk mengacak benih! Dan strategi apa pun yang Anda gunakan pasti tidak murni, karena itu mengharuskan Anda mengumpulkan informasi dari sumber di luar fungsi Anda. Seperti yang diingatkan oleh mtraceur dan jpmc26 , ini mencakup semua pendekatan fisik: generator nomor acak perangkat keras , webcam dengan penutup lensa , pengumpul kebisingan atmosfer - bahkan lampu lava . Semua ini melibatkan penggunaan data yang dihitung dan disimpan di luar fungsi.
Math.random()
yang mengubah status RNG.