मोडुलो पूर्वाग्रह के विषय पर विस्तार करने के लिए, आपका सूत्र है:
max=$((6*3600))
$(($RANDOM%max/3600))
और इस सूत्र में, $RANDOM
0-32767 रेंज में एक यादृच्छिक मूल्य है।
RANDOM Each time this parameter is referenced, a random integer between
0 and 32767 is generated.
यह कल्पना करने में मदद करता है कि यह मानचित्र संभावित मानों के लिए कैसा है:
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
तो आपके सूत्र में, 0, 1, 2 के लिए संभावना 4, 5 से दोगुनी है। और 3 की संभावना 4, 5 से थोड़ी अधिक है। इसलिए आपका परिणाम 0, 1, 2 विजेता के रूप में और 4, 5 हारने वाले के रूप में है।
जब 9*3600
इसे बदलना है , तो यह निम्नानुसार है:
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 में समान संभावना है, लेकिन 0 के लिए अभी भी थोड़ा पूर्वाग्रह है, और इसलिए 100'000 पुनरावृत्तियों के साथ आपके परीक्षण में 0 अभी भी विजेता था।
मोडुलो पूर्वाग्रह को ठीक करने के लिए, आपको पहले सूत्र को सरल करना चाहिए (यदि आप केवल 0-5 चाहते हैं तो मोडुलो 6 है, 3600 नहीं है या क्रैजियर संख्या नहीं है, इसका कोई मतलब नहीं है)। यह सरलीकरण अकेले आपके पूर्वाग्रह को बहुत कम कर देगा (32766 नक्शे 0, 32767 से 1 तक उन दो नंबरों को एक छोटा सा पूर्वाग्रह देना)।
पूर्वाग्रह से पूरी तरह से छुटकारा पाने के लिए, आपको फिर से रोल करने की आवश्यकता होती है, (उदाहरण के लिए) $RANDOM
से कम होने पर 32768 % 6
(उन राज्यों को समाप्त करें जो पूरी तरह से उपलब्ध यादृच्छिक श्रेणी के लिए मैप नहीं करते हैं)।
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
परीक्षा परिणाम:
16425 5
16515 1
16720 0
16769 2
16776 4
16795 3
विकल्प एक अलग यादृच्छिक स्रोत का उपयोग करेगा जिसमें ध्यान देने योग्य पूर्वाग्रह नहीं है (केवल 32768 संभावित मूल्यों से बड़ा परिमाण के आदेश)। लेकिन फिर से एक रोल-तर्क को लागू करना चोट नहीं करता है (भले ही यह कभी भी पास होने की संभावना न हो)।