Untuk memperluas topik bias modulo, rumus Anda adalah:
max=$((6*3600))
$(($RANDOM%max/3600))
Dan dalam rumus ini, $RANDOM
adalah nilai acak di kisaran 0-32767.
RANDOM Each time this parameter is referenced, a random integer between
0 and 32767 is generated.
Ini membantu untuk memvisualisasikan bagaimana ini memetakan ke nilai yang mungkin:
0 = 0-3599
1 = 3600-7199
2 = 7200-10799
3 = 10800-14399
4 = 14400-17999
5 = 18000-21599
0 = 21600-25199
1 = 25200-28799
2 = 28800-32399
3 = 32400-32767
Jadi dalam rumus Anda, probabilitas untuk 0, 1, 2 adalah dua kali lipat dari 4, 5. Dan probabilitas 3 sedikit lebih tinggi dari 4, 5 juga. Maka hasil Anda dengan 0, 1, 2 sebagai pemenang dan 4, 5 sebagai pecundang.
Saat berubah menjadi 9*3600
, itu berubah menjadi:
0 = 0-3599
1 = 3600-7199
2 = 7200-10799
3 = 10800-14399
4 = 14400-17999
5 = 18000-21599
6 = 21600-25199
7 = 25200-28799
8 = 28800-32399
0 = 32400-32767
1-8 memiliki probabilitas yang sama, tetapi masih ada sedikit bias untuk 0, dan karenanya 0 masih menjadi pemenang dalam pengujian Anda dengan 100'000 iterasi.
Untuk memperbaiki bias modulo, Anda harus terlebih dahulu menyederhanakan formula (jika Anda hanya ingin 0-5 maka modulo adalah 6, bukan 3600 atau bahkan angka lebih gila, tidak masuk akal dalam hal itu). Penyederhanaan ini saja akan mengurangi bias Anda banyak (32766 peta ke 0, 32767 ke 1 memberikan bias kecil untuk dua angka).
Untuk menghilangkan bias sama sekali, Anda perlu memutar ulang, (misalnya) ketika $RANDOM
lebih rendah dari 32768 % 6
(menghilangkan negara-negara yang tidak memetakan sempurna untuk rentang acak yang tersedia).
max=6
for f in {1..100000}
do
r=$RANDOM
while [ $r -lt $((32768 % $max)) ]; do r=$RANDOM; done
echo $(($r%max))
done | sort | uniq -c | sort -n
Hasil tes:
16425 5
16515 1
16720 0
16769 2
16776 4
16795 3
Alternatifnya akan menggunakan sumber acak berbeda yang tidak memiliki bias yang nyata (urutan besarnya lebih besar dari hanya 32.768 nilai yang mungkin). Tetapi menerapkan logika re-roll toh tidak ada salahnya (bahkan jika itu sepertinya tidak pernah terjadi).