
rand는 일반적으로 정수 0부터 4294967295 (42억9496만7295) 중 하나를 반환 함
개발진은 %를 통해서 0부터 4294967295 까지의 수들을 분류했다고 보면 됨
%는 나머지를 구하는 연산임. (14 % 4 = 2) 몫3 나머지2
만약 2로 정수 0부터 4294967295의 나머지를 구하면 (rand%2)
0 % 2 = 0
1 % 2 = 1
2 % 2 = 0
...
4294967295 % 2 = 1
0,1,0,1,0,1... 식으로 균등하게 0과1로 배분 됨 (각각 2147483658개씩)
만약 3로 나누면 (rand%3)
0 % 3 = 0
1 % 3 = 1
2 % 3 = 2
3 % 3 = 0
...
4294967295 % 3 = 0
0,1,2,0,1,2...0으로 0이 하나 더 배분 (각각 1431655765개씩, 0은 하나 더 많음)
만약 더 크게 100000000(십억)으로 나머지를 구하면 (rand%100000000)
나머지 0이 5개
나머지 1이 5개
나머지 2이 5개
...
나머지 294967295이 5개
나머지 294967296이 4개 (하나 감소)
나머지 294967297이 4개
...
이렇게 나머지가 앞쪽 (0~294967295)에 위치할 경우 수가 더 배분되는걸 관찰 할 수 있음
이래서 십억같이 매우 큰 수로 나눌 경우
앞 쪽으로 몰리는 수가 매우 많아 짐 (4개와 5개의 차이니까 비율이 매우 큼)
이래서 나머지가 100이하가 나오면 당첨! 이런식으로 코드를 짜면
앞 쪽에 배분이 더 됨으로 확률적 이득이 발생하는 거임
여기서 나오는 나머지 294967296 이 라방에서 등장한 29.5%라는 숫자와 연관이 된걸로 보임
(294967296 / 100000000(십억) = 0.294...)
----------------------------------------------------------------
생각보다 관심을 받아서 좀 더 부연설명 해봄
29.5% 는 왜 나왔는지는 위에서 적은대로 대충 추측할 수 있음
그냥 나머지 294967295 보다 작을 시 이런식으로 구현했으니까
그런데 16.4%는 어디서 나온거냐? 라고 하면
4294967295 을 1000000000(십억) 으로 나누면 4.2949 가 나옴
즉 10억으로 나머지 연산을 했을 경우
0~999999999 의 개별 등장 빈도는 4.2949 라는 거임
위에서 말한
나머지 0이 5개
나머지 1이 5개
나머지 2이 5개
...
나머지 294967295이 5개
나머지 294967296이 4개 (하나 감소)
나머지 294967297이 4개
...
나머지 999999999이 4개
의 평균값이라고 보면 됨
여기서 혜택을 본 나머지 294967295 이하는 5회 등장하는 반면
전체적인 평균 등장 횟수는 4.29임
이를 나눠보면
5 / 4.2949 = 1.16417
여기서 기본값 1 빼면 0.16417
즉 이미지에서 언급된 16.4%에 해당하는 값을 얻을 수 있음
혹시 부족한 점이 있으면 댓글 부탁