참고로 여기 적힌 건 거의 전국민 코딩교육 뉴비 1주차 내용 급 기초 사항임.
검사가 이런 개잡실수를 했을 거라고 생각하진 않음
그냥 망상처럼 생각나서 이럴 수도 있구나 하고 재미로 보셈

확률표 보니까 0.3 ~ 1.3 뜰 확률은 싹다 동일함 (9.0909..)
즉 동일확률

구현하는 인간들은 언제나 가장 쉽게 구현하고 퇴근하는 방법을 찾음
이런 동일확률 보면 눈돌아감 존내 쉽게 생겨먹었기 때문

'0.3, 0.4, ... 1.3 중에 하나를 동일 확률로 뱉는 기능을 짜야 한다' 라는 미션이 주어졌을때,
가장 단순하게 생각하면 이렇게 짤 수 있다.
(대충 파이썬이 가장 읽기 쉬워서 파이썬으로 보여드림)

우선 랜덤 값 만들어주는 함수를 밖에서 모셔온다
random.random()

이 함수는 0~1 사이의 수를 무작위로 떨군다.
이걸 0.3 ~ 1.3 사이에 값이 나오게 하려면?
random.random() + 0.3

이렇게 한 다음, 소숫점 둘째 자리 값을 다 버려야 한다 (0.4232313 이렇게 오르진 않으니까)
보통 가장 쉬운 방법은 10을 곱해서 정수로 바꿔먹고는, 다시 10을 나눠서 해결한다.
(int) ((random.random() + 0.3) * 10) / 10

끝~! 이제 퇴근하면 된다.

-----------------------------------------------------------------------------------

자 그럼 이제 저게 정말 제대로 돌아갈까?
저 값을 10000번 생성해보고, 몇 번씩 나오는지 확인해보자.
테스트코드


결과

?!?!?!?!? 왜 1.3이 안나올까!?!??

왜냐하면, 대부분의 난수 생성기는 0~1 사이의 값을 주지만, 1은 절대 나오지 않기 때문이다.
아무리 높게 나와도 0.9999999999... 같은 값이 나오지만,
0.3 더하고(1.2999999...)
10을 곱하고 (12.99999999)
정수로 만들면 12가 되어 버림
통상적으로 코딩 문법 상에서 실수를 정수로 바꾸면 버림 처리가 되기 때문에
아무리 난수를 튕겨도 12가 나오게 된다.

'그럼 사사오입 하면 되지 않느냐?' 할 수 있는데,
사사오입을 해 보겠다. 보통 0.5를 더한 다음 정수로 바꾸는 식으로 한다(아니면 Math.round()같은거 쓰거나)
(int) ((random.random() + 0.3) * 10 + 0.5) / 10
결과는?

오잉!? 0.3과 1.3이 다른 놈들의 절반 정도의 확률로 나온다.
반올림(round)를 하게 되면, 0.3이 나와야 할 랜덤값 구간 (0~0.1)이
(0~0.05) 로 줄어버리기 때문이다 (0~0.05 => 0.3~0.35 => 3~3.5 => 3~4 => 0.3~0.4)

즉, 애초에 이건 11개의 경우의 수 이기 때문에
아래와 같이 11개의 결과가 분화하게끔 작성이 되어야 한다.
result = (int) ((random.random() * 1.1 + 0.3) * 10) / 10

결과. 조금 편차는 있지만 '909' 에 가까운 발생 수를 나타냄. 많이 할수록 9.09%에 가까워진다


솔직히 돈받고 코딩하는 인간이 할 만한 실수는 아닐 거라 생각함.
만약 진짜 이딴 실수였다? 하루종일 욕 뒤질나게 쳐먹고 다음날부터 시급 0.3배로 받아야지
이게 아닌 다른 방식으로 버그를 만들었을 가능성이 클 거임.
그냥 왜 1.3이 안나왔을까? 하고 대충 혼자 공상하다가 떠올라서
글 싸봄

코딩교육 끝

(참고: 보보보는 이런 방식으로 낸 '버그'가 아님. 보보보는 순수 100%짜리 의도된 로직)