Sebagian besar pemilih acak di web mengalami bias statistik tersembunyi — mulai dari penggunaan Math.random() standar dengan aritmatika modulo hingga pembanding pengocokan yang cacat. Panduan ini menguraikan matematika CSPRNG perangkat keras, pengambilan sampel penolakan, probabilitas tertimbang, dan gangguan yang digunakan dalam Random Picker Calculover.
Mengapa Math.random() dan Modulo Aritmatika Hasil Miring
Dalam JavaScript, Math.random() tidak aman secara kriptografis dan tidak dijamin oleh spesifikasi browser untuk memiliki distribusi yang seragam di semua sistem operasi. Lebih buruknya, banyak pemetik online mengambil bilangan bulat acak dan menggunakan operator modulo (randomUint % N). Karena 232 (4,294,967,296) jarang merupakan kelipatan tepat dari ukuran daftar N, indeks yang lebih rendah memiliki kemungkinan sedikit lebih tinggi untuk dipilih — efek yang dikenal sebagai bias modulo.
Calculover menggunakan Web Crypto API (crypto.getRandomValues) untuk menggambar bilangan bulat 32-bit yang diunggulkan perangkat keras, dikombinasikan dengan pengambilan sampel penolakan: nilai mentah apa pun yang termasuk dalam jendela sisa yang tidak lengkap [floor(2^32 / N) * N, 2^32) akan dibuang dan digambar ulang. Hal ini menjamin seleksi yang tepat secara matematis dan memiliki peluang yang sama untuk setiap kandidat.
Probabilitas Undian Tertimbang dan Pengambilan Sampel Tanpa Penggantian
Dalam undian berbobot, setiap entri i mempunyai bobot w_i. Dalam satu kali undian, kemungkinan entri i menang hanyalah w_i / W_total. Namun, pengundian beberapa pemenang tanpa penggantian memerlukan pengambilan sampel berulang: setelah seorang kandidat menang, tiket mereka akan dihapus dari pool, bobot total dikurangi menjadi W_total - w_winner, dan probabilitas semua kandidat yang tersisa meningkat secara proporsional.
Calculover menerapkan pengurangan roda roulette yang sama persis tanpa penggantian, sehingga memastikan bahwa peserta dengan beberapa tiket menerima keuntungan matematis penuh tanpa memungkinkan kemenangan ganda.
Pengocokan Fisher – Yates vs. Penyortiran Array yang Cacat
Kesalahan pemrograman yang umum adalah mengacak daftar dengan array.sort(() => Math.random() - 0.5). Pembanding ini melanggar transitivitas (jika A > B dan B > C, A harus > C), menghasilkan distribusi yang sangat miring di mana permutasi tertentu dua kali lebih mungkin terjadi dibandingkan permutasi lainnya.
Calculover menggunakan implementasi Durstenfeld dari Fisher–Yates shuffle: melakukan iterasi mundur dari indeks N-1 ke 1, menukar setiap elemen dengan elemen acak yang tidak bias pada atau sebelum indeksnya saat ini. Ini menghasilkan semua N! permutasi dengan sama dengan 1/N! kemungkinan.
Rahasia Santa dan Matematika Kekacauan
Saat mengatur pertukaran hadiah atau tinjauan sejawat, kesalahan umum adalah memasangkan seseorang dengan dirinya sendiri. Penugasan Sinterklas Rahasia yang valid adalah kekacauan — permutasi di mana tidak ada elemen yang tetap (\pi(i) \ne i).
Calculover mencapai hal ini dengan menghasilkan siklus Hamilton yang tidak memihak di seluruh peserta yang diacak (Orang 1 memberikan kepada Orang 2, Orang 2 memberikan kepada Orang 3, ..., Orang N memberikan kepada Orang 1). Siklus matematis ini menjamin tidak adanya pemberian diri dan memastikan satu putaran berkelanjutan tanpa subgrup yang terisolasi.