Kata pengantar
Dalam pengembangan front-end, terutama pengembangan game, angka acak sering digunakan, jadi kami akan memikirkan: Math.random , mari kita lihat kode berikut:
untuk (var i = 0; i <10; i ++) {document.writeln (math.random ()+<br />); }Menjalankan kode di atas memang menghasilkan 10 angka yang berbeda. Tentu saja Anda dapat menghasilkan lebih banyak, yang terlihat cukup bagus. Jika hanya itu, maka tidak perlu menulis artikel ini.
Contoh
Cobalah untuk memikirkannya. Jika kita membuat permainan dalam skenario tertentu dan pengguna keluar setengah jalan, sehingga pengguna dapat memilih untuk melanjutkan kemajuan sebelumnya saat dia masuk. Maka masalahnya sekarang: kita dapat merekam data deskripsi sederhana seperti kemajuan bermain pengguna dan titik pengguna, tetapi hambatan, yang benar -benar ada di setiap kali poin -poin yang ditarik dalam permainan yang ditarik dalam permainan, mereka bahkan mulai untuk mengalahkan setiap kali dimulai secara acak mulai kali ini dimulai pada saat itu dimulai pada saat ini. tidak perlu.
Jadi nomor benih acak muncul. Jika kita memiliki nilai benih ketika elemen ditarik secara acak pada kanvas, dan posisi, ukuran, dll. Dari semua elemen pada halaman dihitung berdasarkan benih ini, maka ketika gambar kedua ditarik, kita hanya perlu melewati benih ini untuk mereproduksi elemen kanvas yang sebelumnya belum selesai.
Kemudian pada saat ini, Anda akan menemukan bahwa matematika. Mari kita terus lihat kode ini:
Salinan kode adalah sebagai berikut:
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; return min + rnd * (maks - min); }; untuk (var i = 0; i <10; i ++) {document.writeln (math.seedrandom ()+<br />); }
Jalankan kode di atas dan Anda akan menemukan bahwa jika matematika seed tetap tidak berubah, nomor acak yang dihasilkan tidak akan berubah. Oh, jika fungsi ini diperkenalkan, maka mereproduksi adegan permainan dapat dicapai. Meskipun diperlukan lebih banyak detail, mekanismenya dapat dijamin. Fokus artikel ini bukan untuk mengimplementasikan permainan seperti itu.
Fokus artikel ini adalah : (Math.Seed * 9301 + 49297) % 233280 , Mengapa ketiga nilai ini, bukan yang lain, dan asal misterius apa yang dimiliki ketiga angka ini?
Generator nomor pseudo-acak seperti Math.seedrandom disebut generator kongruen linier (LCG, generator kongruensial linier). Hampir semua rand yang disediakan oleh runtime library menggunakan LCG, yang seperti:
I n+1 = ai n+c (mod m)
Periode maksimum m dari urutan bilangan pseudo-acak yang dihasilkan adalah antara 0 dan M-1. Untuk mencapai siklus maksimum ini, perlu untuk memenuhi:
1.C dan m saling eksklusif
2.A - 1 dapat dibagi dengan semua faktor utama m
3. Jika m adalah kelipatan dari 4, A - 1 juga harus kelipatan dari 4
Tiga di atas disebut Teorema Hull-Dobell. Sebagai generator bilangan pseudo-acak, memalukan terjebak jika siklusnya tidak cukup besar, jadi ini adalah salah satu persyaratan. Oleh karena itu, berikut ini adalah: A = 9301, C = 49297, M = 233280. Semua tiga item di atas terpenuhi.
Meringkaskan
Di atas adalah pengantar cara mengimplementasikan dan berfungsi angka acak seed di JS. Saya harap ini akan membantu bagi pelajar JavaScript.