Apakah itu penjana nombor rawak?
Penjana nombor rawak (RNG) ialah sistem yang menghasilkan nombor rawak atau nombor rawak pseudo. Sama ada nombor seterusnya benar-benar boleh diramal bergantung pada jenis penjana tersebut. Sesetengah penjana memanfaatkan proses fizikal, sesetengahnya mengira nombor dengan algoritma, dan sesetengah algoritma dibina supaya sesiapa yang melihat hasilnya sekalipun tidak dapat meramal nilai yang seterusnya. Kelihatan rawak dan sukar diramal adalah dua sifat yang berbeza, dan sebahagian besar artikel ini membincangkan perbezaan tersebut.
Penjana nombor rawak perkakasan
Penjana nombor rawak perkakasan (HRNG), yang juga dipanggil penjana nombor rawak tulen (TRNG), memperoleh nombor daripada proses fizikal. Bentuk yang paling lama berfungsi di depan mata kita: lambungan syiling, lemparan dadu, roda rolet. Ilmu mekanik menjelaskan setiap pergerakannya secara menyeluruh, namun roda yang dibuat dengan teliti tetap sukar diramal secara praktikal, kerana perbezaan kecil pada permulaan setiap putaran berkembang menjadi hasil yang berbeza sama sekali.
Penjana perkakasan moden pula mengukur fenomena mikroskopik: hingar tembakan dan hingar terma dalam litar elektronik, hingar atmosfera serta kesan kuantum. Fenomena ini merupakan sumber entropi yang baik — tahap ketakpastian yang boleh diukur — namun sumber fizikal tidak sempurna secara semula jadi: ia boleh mempunyai kecenderungan berat sebelah, boleh mengalami hanyutan dan boleh gagal, jadi kualitinya perlu dinilai serta dipantau, dan hasilnya diproses lanjut jika perlu, seperti yang dijelaskan dalam piawaian seperti NIST SP 800-90B. Sumber perkakasan digunakan apabila jaminan amat diutamakan — terutamanya dalam kriptografi, iaitu tempat ia membekalkan bahan pemula yang tidak dapat diramal bagi kunci di sebalik protokol seperti Transport Layer Security (TLS).
Penjana nombor rawak pseudo
Alternatif kepada peranti fizikal ialah algoritma. Penjana nombor rawak pseudo (PRNG) menghasilkan jujukan yang kelihatan rawak tetapi ditentukan sepenuhnya oleh nilai awal yang dipanggil benih (seed). Berikan benih yang sama kepada algoritma yang sama, anda akan mendapat jujukan yang serupa setiap kali. Keadaan ini merupakan satu kelemahan apabila hasil mestilah sukar diramal dan benih atau keadaan dalamannya boleh ditebak atau dibina semula, namun menjadi satu kelebihan apabila sesuatu hasil mestilah boleh dihasilkan semula — simulasi atau ujian boleh dijalankan semula dengan tepat. PRNG juga pantas, murah dan mudah dilaksanakan, dan itulah sebabnya kebanyakan perisian bergantung padanya. Antara algoritma yang terkenal termasuklah penjana kongruen linear (LCG), penjana xorshift dan Mersenne Twister.
Mersenne Twister
Mersenne Twister, yang diterbitkan pada tahun 1997 oleh Makoto Matsumoto dan Takuji Nishimura, ialah salah satu penjana nombor rawak pseudo yang paling banyak digunakan serta menjadi pilihan lalai dalam pelbagai bahasa pengaturcaraan. Namanya diambil daripada tempoh pusingannya — panjang jujukan sebelum ia berulang — yang mana dalam varian standard, MT19937, merupakan nombor perdana Mersenne 219937 − 1. Ia lulus kebanyakan ujian statistik kerawakan dan sesuai untuk simulasi. Walau bagaimanapun, ia tidak direka untuk menyimpan rahsia: daripada 624 nilai hasil 32-bit yang berturutan, sesiapa sahaja boleh membina semula keadaan dalamannya dan meramal setiap nilai yang menyusul, jadi ia sama sekali tidak boleh digunakan untuk kunci, kata laluan atau apa-apa sahaja yang perlu kekal sukar diramal.
Penjana selamat secara kriptografi dan entropi
Banyak aplikasi memerlukan kedua-dua ciri serentak: kepantasan algoritma dan ketakpastian sumber fizikal. Jawapannya ialah penjana nombor rawak pseudo selamat secara kriptografi (CSPRNG). Ia masih sebuah PRNG, tetapi dibina khusus supaya tindakan melihat sebahagian daripada hasilnya tidak memberi cara praktikal untuk meramal baki nilai yang lain, malah ia diberi benih, serta diberi benih semula secara berkala, daripada sumber entropi sebenar. Benih daripada sumber fizikal tidak menjadikan PRNG biasa selamat; algoritma itu sendiri mesti direka bentuk untuk tujuan tersebut. Sumber fizikal seperti hingar terma atau pemasaan peristiwa perkakasan membekalkan sejumlah kecil kerawakan tulen, dan daripadanya CSPRNG menghasilkan jujukan nilai yang panjang dengan jauh lebih pantas. Gabungan inilah yang ditawarkan oleh sistem pengendalian kepada program yang berjalan padanya, dan inilah yang lazimnya dimaksudkan dengan "penjana nombor rawak" dalam amalan hari ini. Ia menghasilkan kunci penyulitan, token sesi dan kata laluan.
Nombor rawak dalam pelayar
JavaScript menyediakan dua cara terbina dalam untuk halaman web memperoleh nilai rawak, dan kedua-duanya tergolong dalam kelas yang berbeza. Math.random() ialah PRNG biasa: standard bahasa menyerahkan pemilihan algoritmanya kepada budi bicara setiap pelayar dan tidak menjanjikan sebarang keselamatan — memadai untuk animasi, tetapi tidak sesuai untuk cabutan yang mungkin dipertikaikan orang. Satu lagi ialah Web Crypto API. Kaedah crypto.getRandomValues() miliknya mengembalikan nilai rawak yang kukuh secara kriptografi, yang dihasilkan oleh CSPRNG dengan benih daripada entropi sistem pengendalian.
Penjana nombor rawak dalam talian kami menggunakan Web Crypto API untuk setiap cabutan, dan nombor tersebut dihasilkan dalam pelayar anda dan bukannya pada pelayan. Sumber yang sama turut menggerakkan penjana lain di laman web ini, sama ada anda melempar dadu, melambung syiling mahupun menjana kata laluan.
Daripada bit rawak kepada nombor dalam julat anda
Penjana yang selamat secara kriptografi hanyalah separuh daripada cabutan yang adil. Ia membekalkan bit mentah, dan program tetap perlu menukarkannya menjadi nombor dalam julat anda — di sinilah kecenderungan berat sebelah boleh menyelinap masuk. Andaikan sumber tersebut memberikan nilai 0 hingga 9 dengan peluang yang sama rata dan anda memerlukan nombor dari 0 hingga 5. Mengambil baki selepas dibahagikan dengan 6 nampak wajar, namun nombor 0, 1, 2 dan 3 masing-masing boleh muncul melalui dua cara manakala 4 dan 5 hanya melalui satu cara, jadi setiap nombor 0 hingga 3 mempunyai peluang 20%, dan 4 serta 5 hanya 10% setiap satu. Satu cara untuk menghapuskan kecenderungan berat sebelah ini adalah dengan membuang nilai yang tidak sepadan dan membuat cabutan semula; bahan nombor rawak menerangkan perkara ini secara terperinci.
Dua perkara lagi sering mengejutkan orang ramai. Pengulangan ialah perkara biasa: apabila nombor bulat dari 1 hingga 10 dicabut secara bebas dan setiap nombor mempunyai kebarangkalian yang sama, nombor yang baru sahaja dicabut mempunyai peluang 1 dalam 10 yang sama untuk muncul semula seperti mana-mana nombor lain. Cabutan tanpa ulangan ialah jenis cabutan yang berbeza, bukannya cabutan yang lebih rawak. Selain itu, penjana yang adil semata-mata tidak menjadikan keseluruhan prosedur adil: senarai peserta dan bilangan percubaan juga sama pentingnya, seperti yang dijelaskan dalam artikel kami tentang cara memilih pemenang peraduan secara rawak.