$ RANDOM을 사용할 때 결과가 고르지 않게 퍼지는 이유는 무엇입니까?

cprn

나는에 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))

그리고이 공식에서는 $RANDOM0-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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Bootstrap을 사용할 때이 하이퍼 링크가 작동하지 않는 이유는 무엇입니까?

분류에서Dev

'async'모듈을 사용하지 않을 때만 결과가 반환되는 이유는 무엇입니까?

분류에서Dev

탭을 사용할 때 Travis가 통과하지 못하게하는 이유는 무엇입니까?

분류에서Dev

Try [Unit]의 결과로 for comprehension을 사용할 때 (일관되지 않은) 컴파일러 오류가 발생하는 이유는 무엇입니까?

분류에서Dev

JFrame에 FlowLayout을 사용할 때 이미지가 나타나지 않는 이유는 무엇입니까?

분류에서Dev

@Binding을 사용할 때 텍스트가 업데이트되지 않는 이유는 무엇입니까?

분류에서Dev

고정 폭 글꼴을 사용할 때 ImageFont.getsize ()가 문자를 일관되지 않게 측정하는 이유는 무엇입니까?

분류에서Dev

스택 메모리가 사용되지 않을 때 할당되는 이유는 무엇입니까?

분류에서Dev

부트 스트랩을 사용할 때 카드가 응답하지 않는 이유는 무엇입니까?

분류에서Dev

fstab을 사용할 때 / dev / sdxy가 권장되지 않는 이유는 무엇입니까?

분류에서Dev

동적 메뉴에 DataTemplate을 사용할 때 핫키가 작동하지 않는 이유는 무엇입니까?

분류에서Dev

사용자 정의보기 속성을 통해 스타일을 전달할 때 텍스트가 굵게 표시되지 않는 이유는 무엇입니까?

분류에서Dev

getline을 사용한 후 cin이 버퍼 데이터를 가져 오지 않는 이유는 무엇입니까?

분류에서Dev

Mockito 또는 PowerMock을 사용하여 싱글 톤을 모의하려고 할 때 예외가 발생하지 않는 이유는 무엇입니까?

분류에서Dev

nullable이 아닌 값을 null로 설정할 때 TypeScript가 경고하지 않는 이유는 무엇입니까?

분류에서Dev

std :: string을 정렬 할 때 C ++ 11 std :: sort ()가 더 빠르지 않은 이유는 무엇입니까?

분류에서Dev

setTimeout 메서드를 사용할 때 변수가 유지되지 않는 이유는 무엇입니까?

분류에서Dev

Google API에서 iOS 용 장소 자동 완성을 사용하려고 할 때 5 개의 결과가 더 이상 나오지 않는 이유는 무엇입니까?

분류에서Dev

클래스 변환기를 사용할 때 enableImplicitConversion을 사용하지 않는 이유는 무엇입니까?

분류에서Dev

이 JavaScript를 사용할 때 이미지가 순환하지 않는 이유는 무엇입니까?

분류에서Dev

시간대를 사용할 때 momentjs의 isSame 메서드가 올바르게 작동하지 않는 이유는 무엇입니까?

분류에서Dev

사용자 지정 PHP 모듈을 사용할 때 $ _POST가 채워지지 않는 이유는 무엇입니까?

분류에서Dev

Emacs : 파일을 열 때 주 모드가 올바르게 설정되지 않은 이유는 무엇입니까?

분류에서Dev

glut와 함께 OpenGL을 사용할 때 창을 닫았다가 다시 열 때 아무것도 표시되지 않는 이유는 무엇입니까?

분류에서Dev

JavaScript Promises가 때때로 .catch를 사용하지 않고 .then을 사용하지 않는 이유는 무엇입니까?

분류에서Dev

CSS를 사용할 때 페이지가로드되지 않는 이유는 무엇입니까?

분류에서Dev

힙 공간을 늘리려 고 할 때 Java CLI가 반응하지 않는 이유는 무엇입니까?

분류에서Dev

new 또는 delete를 사용하지 않을 때 힙 오류가 발생하는 이유는 무엇입니까?

분류에서Dev

XSLT 출력 방법 "html"을 사용하려고 할 때 내 SVG가 표시되지 않는 이유는 무엇입니까?

Related 관련 기사

  1. 1

    Bootstrap을 사용할 때이 하이퍼 링크가 작동하지 않는 이유는 무엇입니까?

  2. 2

    'async'모듈을 사용하지 않을 때만 결과가 반환되는 이유는 무엇입니까?

  3. 3

    탭을 사용할 때 Travis가 통과하지 못하게하는 이유는 무엇입니까?

  4. 4

    Try [Unit]의 결과로 for comprehension을 사용할 때 (일관되지 않은) 컴파일러 오류가 발생하는 이유는 무엇입니까?

  5. 5

    JFrame에 FlowLayout을 사용할 때 이미지가 나타나지 않는 이유는 무엇입니까?

  6. 6

    @Binding을 사용할 때 텍스트가 업데이트되지 않는 이유는 무엇입니까?

  7. 7

    고정 폭 글꼴을 사용할 때 ImageFont.getsize ()가 문자를 일관되지 않게 측정하는 이유는 무엇입니까?

  8. 8

    스택 메모리가 사용되지 않을 때 할당되는 이유는 무엇입니까?

  9. 9

    부트 스트랩을 사용할 때 카드가 응답하지 않는 이유는 무엇입니까?

  10. 10

    fstab을 사용할 때 / dev / sdxy가 권장되지 않는 이유는 무엇입니까?

  11. 11

    동적 메뉴에 DataTemplate을 사용할 때 핫키가 작동하지 않는 이유는 무엇입니까?

  12. 12

    사용자 정의보기 속성을 통해 스타일을 전달할 때 텍스트가 굵게 표시되지 않는 이유는 무엇입니까?

  13. 13

    getline을 사용한 후 cin이 버퍼 데이터를 가져 오지 않는 이유는 무엇입니까?

  14. 14

    Mockito 또는 PowerMock을 사용하여 싱글 톤을 모의하려고 할 때 예외가 발생하지 않는 이유는 무엇입니까?

  15. 15

    nullable이 아닌 값을 null로 설정할 때 TypeScript가 경고하지 않는 이유는 무엇입니까?

  16. 16

    std :: string을 정렬 할 때 C ++ 11 std :: sort ()가 더 빠르지 않은 이유는 무엇입니까?

  17. 17

    setTimeout 메서드를 사용할 때 변수가 유지되지 않는 이유는 무엇입니까?

  18. 18

    Google API에서 iOS 용 장소 자동 완성을 사용하려고 할 때 5 개의 결과가 더 이상 나오지 않는 이유는 무엇입니까?

  19. 19

    클래스 변환기를 사용할 때 enableImplicitConversion을 사용하지 않는 이유는 무엇입니까?

  20. 20

    이 JavaScript를 사용할 때 이미지가 순환하지 않는 이유는 무엇입니까?

  21. 21

    시간대를 사용할 때 momentjs의 isSame 메서드가 올바르게 작동하지 않는 이유는 무엇입니까?

  22. 22

    사용자 지정 PHP 모듈을 사용할 때 $ _POST가 채워지지 않는 이유는 무엇입니까?

  23. 23

    Emacs : 파일을 열 때 주 모드가 올바르게 설정되지 않은 이유는 무엇입니까?

  24. 24

    glut와 함께 OpenGL을 사용할 때 창을 닫았다가 다시 열 때 아무것도 표시되지 않는 이유는 무엇입니까?

  25. 25

    JavaScript Promises가 때때로 .catch를 사용하지 않고 .then을 사용하지 않는 이유는 무엇입니까?

  26. 26

    CSS를 사용할 때 페이지가로드되지 않는 이유는 무엇입니까?

  27. 27

    힙 공간을 늘리려 고 할 때 Java CLI가 반응하지 않는 이유는 무엇입니까?

  28. 28

    new 또는 delete를 사용하지 않을 때 힙 오류가 발생하는 이유는 무엇입니까?

  29. 29

    XSLT 출력 방법 "html"을 사용하려고 할 때 내 SVG가 표시되지 않는 이유는 무엇입니까?

뜨겁다태그

보관