Lewati ke konten utama

Cara kerja pengundian

Bukan sekadar “percaya saja pada kami, ini acak”. Inilah metodenya.

Pemenang dipilih sebelum roda bergerak

Setiap putaran memilih pemenang terlebih dahulu, baru kemudian mengarahkan animasi ke pemenang tersebut. Urutan itulah yang membuat seberapa kuat Anda memutar roda tidak dapat mengubah hasilnya, dan mengapa mengaktifkan fitur pengurangan gerakan (reduced motion) memberi Anda hasil undian yang sama tanpa animasi alih-alih jalur kode yang berbeda. Ini juga berarti putaran yang Anda lihat adalah pemeragaan ulang dari keputusan yang sudah dibuat sebelumnya — satu-satunya cara agar kedua janji di atas dapat terpenuhi bersamaan.

Dari mana keacakan berasal

Sumber keacakannya adalah generator kriptografi bawaan browser Anda, crypto.getRandomValues, bukan Math.random. Math.random boleh ditebak polanya, dan pada beberapa mesin memang demikian; untuk pengundian hadiah, hal ini sangat penting.

Mengapa kami membuang beberapa angka

Mengubah angka acak 32-bit menjadi “angka dari 0 sampai 11” menggunakan operasi sisa bagi (modulo) memiliki ketidakadilan kecil yang tersembunyi. 2³² tidak habis dibagi 12, sehingga beberapa opsi pertama masing-masing mendapat satu peluang ekstra. Pada roda dengan dua belas juring, biasnya memang kecil, tetapi nyata, selalu menguntungkan juring yang sama, dan tidak akan pernah merata secara rata-rata. Jadi, alih-alih mengambil sisa bagi, kami membuang setiap hasil undian yang jatuh pada sisa yang tidak merata tersebut dan meminta undian baru. Cara ini terkadang memerlukan pengundian ekstra, tetapi menghasilkan hasil yang benar-benar seragam secara eksak.

const limit = Math.floor(2 ** 32 / max) * max;

let draw = crypto.getRandomValues(new Uint32Array(1))[0];
while (draw >= limit) {
  draw = crypto.getRandomValues(new Uint32Array(1))[0];
}

return draw % max;

Bobot, dan alasan ukuran juring cocok dengannya

Pengundian berbobot menjumlahkan seluruh bobot, memilih angka seragam di bawah total tersebut menggunakan metode penolakan (rejection sampling) yang sama, dan menentukan opsi mana yang ditempati angka tersebut. Roda kemudian menggambar setiap juring tepat sesuai proporsi bagian lingkarannya. Roda dengan juring yang terlihat sama besar padahal peluangnya berbeda adalah bentuk manipulasi yang kami tentang, sehingga luas area dan peluang adalah angka yang sama sejak awal perancangan, bukan sekadar kebijakan tampilan.

Daftar Anda tidak pernah keluar dari browser

Tidak ada akun dan tidak ada penyimpanan di sisi server. Daftar Anda berada di browser ini, dan tautan berbagi membawa data roda di dalam URL itu sendiri. Tidak ada data pengundian yang direkam di tempat mana pun yang dapat kami lihat.

Periksa sendiri

Kode pengundian ini hanya beberapa puluh baris dan setiap klaim di atas dicakup oleh pengujian otomatis yang akan gagal jika hal tersebut tidak lagi benar — termasuk pengujian yang memasukkan angka ke generator yang dirancang untuk memicu bias modulo dan memastikan hasilnya tetap seragam.

Roda dapat memuat hingga 1000 opsi, dan metode di atas sama persis untuk satu opsi maupun seluruh 1000 opsi.