Roda sudah tahu pemenangnya
Alasan pemenang diundi sebelum animasi dimulai, dan keuntungan yang Anda dapatkan.
Tekan Putar dan roda berputar selama sepuluh detik. Kelihatannya hasil putaran sedang ditentukan di suatu titik dalam sepuluh detik tersebut — dalam perlambatan, dalam setengah putaran terakhir, atau apakah jarum penunjuk berhasil melewati satu garis pembatas lagi.
Kenyataannya tidak demikian. Pemenang sudah diundi terlebih dahulu, hanya dalam beberapa mikrodetik, dan animasi kemudian diarahkan tepat ke hasil tersebut.
Mengapa urutannya seperti itu
Alternatif yang paling jelas adalah memutar roda lalu melihat di mana ia berhenti. Cara ini terdengar lebih adil — tidak ada yang memilih, murni hukum fisika — namun justru jauh lebih sulit dipertahankan keabsahannya, karena hal itu mengubah setiap pertanyaan tentang keadilan menjadi pertanyaan tentang animasi.
Bisakah Anda mengibaskan roda lebih keras untuk mengubah hasil? Apakah mengeklik di tengah putaran untuk
menghentikannya lebih awal akan memengaruhi hasil? Apa yang terjadi pada seseorang yang menjelajah dengan
opsi prefers-reduced-motion aktif, yang sama sekali tidak melihat animasi?
Jika diundi terlebih dahulu, ketiga pertanyaan tersebut memiliki jawaban yang sama: tidak, karena pengundian sudah selesai dilakukan. Kibasan keras memberi putaran tambahan. Klik lebih awal mempersingkat durasi putaran. Opsi kurangi gerakan (reduced motion) melompati putaran sepenuhnya dan langsung mengumumkan hasilnya. Tiga alur pengalaman berbeda melalui satu kode yang sama, alih-alih tiga percabangan logika yang masing-masing harus diperdebatkan secara terpisah.
Apa yang melakukan pengundian
Entropi yang digunakan adalah crypto.getRandomValues — generator kriptografi bawaan peramban — dan bukan Math.random.
Menghasilkan angka acak yang benar-benar seragam darinya membutuhkan satu langkah tambahan dari yang terlihat.
Operasi standar draw % count akan bias setiap kali count tidak membagi
2³² secara merata: beberapa entri pertama masing-masing mendapatkan satu peluang ekstra dari empat miliar kemungkinan.
Perbedaannya kecil, tetapi itu tetap memengaruhi keadilan, dan roda yang mengklaim adil tidak boleh memilikinya. Oleh karena itu, hasil undian yang jatuh pada sisa angka berlebih akan dibuang dan pengundian dilakukan ulang.
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;
Hal ini memerlukan sesekali pengundian ekstra tetapi menjamin hasil yang benar-benar seragam dan adil. Kode yang sama dapat dilihat di halaman keadilan, di mana kode tersebut menjadi konten utama dan bukan sekadar ilustrasi.
Bobot adalah peluang, bukan hak istimewa
Beri entri bobot 3, maka entri tersebut mendapat tiga bagian undian, bukan satu. Roda akan menampilkannya sebagai juring yang lebih lebar, dan daftar akan menampilkan persentase peluang yang sebenarnya dihasilkan oleh bobot tersebut, sehingga tidak ada yang perlu menghitungnya secara manual.
Dua entri dengan teks yang sama tetap menjadi dua entri terpisah. Masing-masing mempertahankan peluangnya sendiri, dan daftar akan mencantumkan berapa banyak duplikasi yang ditemukan alih-alih menggabungkannya secara diam-diam — memotong separuh peluang seseorang tanpa memberi tahu mereka adalah jenis bantuan yang tidak diinginkan siapa pun.
Untuk apa animasi tetap ada
Animasi yang sudah ditargetkan bukanlah animasi palsu. Roda benar-benar bergerak menuju juring tempat ia mendarat, bunyi detak benar-benar disinkronkan dengan garis pembatas yang dilewatinya, dan keraguan nyaris-kena — saat Anda mengaktifkannya — akan tertahan di juring tetangga pemenang alih-alih juring acak, lalu berlanjut ke entri yang memang sudah terpilih sebelum semua itu dimulai.
Sensasi tegangnya nyata. Hasilnya hanya ditentukan lebih awal dari yang terlihat.