Per espandere l'argomento della distorsione del modulo, la formula è:
max=$((6*3600))
$(($RANDOM%max/3600))
E in questa formula, $RANDOM
è un valore casuale nell'intervallo 0-32767.
RANDOM Each time this parameter is referenced, a random integer between
0 and 32767 is generated.
Aiuta a visualizzare come questo si associa a possibili valori:
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
Quindi, nella tua formula, la probabilità di 0, 1, 2 è doppia rispetto a 4, 5. E anche la probabilità di 3 è leggermente superiore a 4, 5. Da qui il tuo risultato con 0, 1, 2 come vincitori e 4, 5 come perdenti.
Quando si cambia in 9*3600
, si presenta come:
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 hanno la stessa probabilità, ma c'è ancora una leggera propensione per 0, e quindi 0 è stato ancora il vincitore nel tuo test con 100.000 iterazioni.
Per correggere la distorsione del modulo, dovresti prima semplificare la formula (se vuoi solo 0-5, allora il modulo è 6, non 3600 o anche un numero più folle, non ha senso in questo). Questa semplificazione da sola ridurrà di molto la tua propensione (32766 mappe a 0, 32767 a 1 dando una leggera propensione a quei due numeri).
Per eliminare del tutto il pregiudizio, è necessario ripetere il rollback (ad esempio) quando $RANDOM
è inferiore a 32768 % 6
(eliminare gli stati che non si associano perfettamente all'intervallo casuale disponibile).
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
Risultato della prova:
16425 5
16515 1
16720 0
16769 2
16776 4
16795 3
L'alternativa sarebbe usare una diversa fonte casuale che non abbia una distorsione evidente (ordini di grandezza maggiori di soli 32768 valori possibili). Tuttavia, implementare una logica di ripetizione non fa male (anche se probabilmente non avverrà mai).