Apa itu generator angka acak?
Generator angka acak (RNG) adalah sistem yang menghasilkan angka acak atau acak semu. Apakah angka berikutnya benar-benar dapat diprediksi bergantung pada jenis generator yang digunakan. Beberapa generator memanfaatkan proses fisik, sebagian menghitung angkanya dengan algoritma, dan beberapa algoritma dibangun sedemikian rupa sehingga orang yang telah melihat nilai yang dihasilkan pun tidak dapat menebak apa yang akan muncul berikutnya. Tampak acak dan benar-benar tidak dapat diprediksi adalah dua sifat yang berbeda, dan sebagian besar artikel ini membahas perbedaan tersebut.
Generator angka acak perangkat keras
Generator angka acak perangkat keras (HRNG), yang juga disebut generator angka acak sejati (TRNG), memperoleh angkanya dari suatu proses fisik. Contoh yang paling tua bekerja tepat di depan mata kita: koin yang dilempar, dadu yang digulirkan, atau roda rolet. Hukum mekanika dapat menjelaskan setiap contoh tersebut secara menyeluruh, tetapi roda rolet yang dibuat dengan baik tetap tidak dapat diprediksi dalam praktiknya, karena perbedaan kecil pada awal putaran akan berkembang menjadi hasil akhir yang sama sekali berbeda.
Sebaliknya, generator perangkat keras modern mengukur fenomena mikroskopis: derau tembakan (shot noise) dan derau termal pada rangkaian elektronik, derau atmosfer, serta efek kuantum. Semua ini merupakan sumber entropi yang baik — yaitu ketidakterdugaan yang dapat diukur — namun sumber fisik pada dasarnya tidak sempurna: sumber tersebut dapat memiliki bias, dapat mengalami pergeseran (drift), dan dapat mengalami kegagalan. Oleh karena itu, kualitasnya harus dinilai dan dipantau, serta hasilnya diproses lebih lanjut jika diperlukan, seperti yang dijelaskan dalam standar seperti NIST SP 800-90B. Sumber perangkat keras digunakan pada bidang yang paling membutuhkan jaminan tersebut — terutama dalam kriptografi, di mana sumber ini menyediakan bahan awal yang tidak dapat diprediksi untuk kunci di balik protokol seperti Transport Layer Security (TLS).
Generator angka acak semu
Alternatif dari perangkat fisik adalah algoritma. Generator angka acak semu (PRNG) menghasilkan urutan yang tampak acak, tetapi sepenuhnya ditentukan oleh nilai awal yang disebut seed (nilai awal). Jika Anda memberikan nilai awal yang sama ke algoritma yang sama, Anda akan mendapatkan urutan yang sama persis setiap saat. Hal itu menjadi kelemahan jika hasilnya harus tidak dapat diprediksi dan nilai awal atau status internalnya dapat ditebak atau direkonstruksi, sekaligus menjadi keunggulan jika hasilnya harus dapat diulang — misalnya simulasi atau pengujian yang perlu dijalankan kembali dengan hasil yang sama persis. PRNG juga cepat, hemat biaya, dan mudah diterapkan, sehingga sebagian besar perangkat lunak mengandalkannya. Algoritma yang terkenal mencakup generator kongruen linear (LCG), generator xorshift, dan Mersenne Twister.
Mersenne Twister
Mersenne Twister, yang dipublikasikan pada tahun 1997 oleh Makoto Matsumoto dan Takuji Nishimura, adalah salah satu generator angka acak semu yang paling banyak digunakan dan menjadi standar bawaan di banyak bahasa pemrograman. Namanya berasal dari periodenya — panjang urutan angka sebelum berulang kembali — yang pada varian standarnya, MT19937, merupakan bilangan prima Mersenne 219937 − 1. Algoritma ini lolos sebagian besar pengujian statistik keacakan dan cocok untuk simulasi. Namun, algoritma ini tidak dirancang untuk menjaga rahasia: dari 624 nilai keluaran 32-bit berturut-turut, siapa pun dapat merekonstruksi status internalnya dan memprediksi setiap nilai berikutnya, sehingga algoritma ini tidak boleh digunakan untuk kunci, kata sandi, atau hal lain yang harus tetap tidak dapat diprediksi.
Generator yang aman secara kriptografis dan entropi
Banyak aplikasi membutuhkan dua hal sekaligus: kecepatan algoritma dan ketidakterdugaan dari sumber fisik. Solusinya adalah generator angka acak semu yang aman secara kriptografis (CSPRNG). Generator ini tetap merupakan PRNG, tetapi dibangun sedemikian rupa sehingga melihat sebagian nilainya tidak memberikan cara praktis untuk memprediksi sisanya, dan generator ini diberi nilai awal, serta diperbarui secara berkala, dari sumber entropi nyata. Nilai awal dari sumber fisik tidak membuat PRNG biasa menjadi aman; algoritmanya sendiri harus dirancang untuk tujuan tersebut. Sumber fisik seperti derau termal atau ketepatan waktu peristiwa perangkat keras memasok sedikit keacakan sejati, dan dari situ CSPRNG menghasilkan rangkaian nilai yang panjang dengan jauh lebih cepat. Kombinasi inilah yang disediakan oleh sistem operasi untuk program-program yang berjalan di atasnya, dan inilah yang biasanya dimaksud dengan "generator angka acak" dalam praktik saat ini. Sistem ini menghasilkan kunci enkripsi, token sesi, dan kata sandi.
Angka acak di browser
JavaScript menyediakan dua cara bawaan bagi halaman web untuk memperoleh nilai acak, dan keduanya berasal dari kelas yang berbeda. Math.random() adalah PRNG biasa: standar bahasa menyerahkan pemilihan algoritmanya kepada masing-masing browser dan tidak menjanjikan keamanan apa pun — cukup untuk animasi, tetapi tidak layak untuk undian yang mungkin diperdebatkan hasilnya. Cara lainnya adalah Web Crypto API. Metodenya crypto.getRandomValues() mengembalikan nilai acak yang kuat secara kriptografis, yang dihasilkan oleh CSPRNG yang diberi nilai awal dari entropi sistem operasi.
Generator angka acak online kami menggunakan Web Crypto API untuk setiap pengundian, dan angka-angka tersebut dihasilkan di browser Anda, bukan di server. Sumber yang sama juga menggerakkan generator lain di situs ini, baik saat Anda melempar dadu, melempar koin, maupun membuat kata sandi.
Dari bit acak ke angka dalam rentang Anda
Generator yang aman secara kriptografis hanyalah separuh dari pengundian yang adil. Generator ini menghasilkan bit mentah, dan program masih harus mengubahnya menjadi angka dalam rentang yang Anda butuhkan — dan di sinilah ketidakseimbangan peluang dapat muncul. Misalnya sumber menghasilkan nilai 0 sampai 9 dengan peluang yang sama, dan Anda membutuhkan angka dari 0 sampai 5. Mengambil sisa hasil bagi setelah dibagi 6 tampak wajar, tetapi angka 0, 1, 2, dan 3 kemudian masing-masing dapat muncul melalui dua cara, sedangkan 4 dan 5 hanya melalui satu cara. Akibatnya, masing-masing angka 0 sampai 3 memiliki peluang 20%, sementara 4 dan 5 hanya mendapatkan 10% masing-masing. Salah satu cara untuk menghilangkan ketidakseimbangan ini (modulo bias) adalah membuang nilai yang tidak sesuai dan melakukan pengundian ulang; artikel dalam materi generator angka acak membahas hal ini secara terperinci.
Ada dua hal lain yang sering mengejutkan orang. Pengulangan adalah hal yang normal: ketika sebuah bilangan bulat dari 1 sampai 10 diundi secara independen dan setiap angka memiliki peluang yang sama, angka yang baru saja muncul memiliki peluang 1 banding 10 yang sama untuk keluar kembali seperti angka lainnya. Pengundian tanpa pengulangan adalah jenis pengundian yang berbeda, bukan pengundian yang lebih acak. Dan generator yang adil saja tidak membuat seluruh prosedur menjadi adil: daftar peserta dan jumlah percobaan juga sama pentingnya, seperti yang dijelaskan dalam panduan kami tentang cara memilih pemenang undian secara acak.