나는에 RNG에 대해 읽어 위키 백과 와 $RANDOM
의 기능 TLDP 하지만 정말이 결과를 설명하지 않습니다 :
$ max=$((6*3600))
$ for f in {1..100000}; do echo $(($RANDOM%max/3600)); done | sort | uniq -c
21787 0
22114 1
21933 2
12157 3
10938 4
11071 5
왜 약 2 배 이상의 값이 3, 4, 5보다 0, 1, 2가되는 경향이 있지만 최대 모듈로를 변경하면 10 개 값 모두에 거의 균등하게 분산됩니까?
$ max=$((9*3600))
$ for f in {1..100000}; do echo $(($RANDOM%max/3600)); done | sort | uniq -c
11940 0
11199 1
10898 2
10945 3
11239 4
10928 5
10875 6
10759 7
11217 8
모듈로 편향의 주제를 확장하려면 공식은 다음과 같습니다.
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에 대해 약간의 편향이 있으므로 10 만 번의 반복으로 테스트에서 0이 여전히 승자입니다.
모듈로 바이어스를 수정하려면 먼저 공식을 단순화해야합니다 (0-5 만 원하는 경우 모듈로는 3600 또는 더 미친 숫자가 아니라 6입니다. 이 단순화만으로도 편향을 많이 줄일 수 있습니다 (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 개보다 큰 순서). 그러나 어쨌든 리롤 로직을 구현하는 것은 문제가되지 않습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다