우선, 하나의 프로그램만 가지고
완전한 랜덤을 만드는건 불가능에 가까움.
얘들은 계산만 할 줄 알거든.
그래서 보통 컴퓨터에서 랜덤은
진짜 랜덤이 아니라 마치 랜덤 처럼 보이는 수,
의사 난수를 만들어낸다.
이걸 어떻게 하냐고?

우선 기준이 되는 수를 정한다
이걸 시드(seed)라고 부르는데
이 수를 바탕으로 난수를 만들기 때문임.

난수를 만드는 방법은 선형합동법이 대표적이지만
알 필요가 없으니까 패스함.
그냥 기준이 되는 수로 수열을 만들어낸다고 생각하면 됨

그리고 만들어진 난수에서
필요한 만큼만 잘라서 랜덤인것처럼 보이게 쓴다.




이렇게 이야기하면 어려우니까
예를 들어서 설명을 해볼게

82라는 시드로
0.157268534236004268542 라는 난수가 나왔다고 하자.

얘를 가지고 성공 확률 0.5%인 일리 무기 25강을 시도 할 경우
이 수를 3자리 씩 읽어들인 후에
(157, 268, 534, 236, 004, 268, 542)

000, 001, 002, 003, 004라는 수가 나오면 성공
005~999까지의 995가지 수는 실패가 되도록 처리하는거지.
이 시드 대로라면 5트에서 004가 나와서 강화가 붙 게 된다.

그런데 이 고정된 시드를 사용하는 방법이 뭐가 문제냐?

1.같은 시드를 사용하면 같은 결과 값이 나오게 된다.
위의 예시와 똑같은, 82 시드를 가진 사람이 있으면
똑같은 강화운을 가지게 되는거지.

2.결과가 랜덤이 아니라, 난수가 이미 정해준 순서를 따라갈 뿐이다.
내 강화 난수 시드가 67로 고정되어있는데
이 수열에서는 1000번째가 되어야 000~004가 나온다고 하자.
그러면 나는 그냥 장기백 확정인거임. 이건 정해진 운명이고
어떻게 해도 뒤엎을 수가 없음.

즉, 고정된 시드로 랜덤을 만드는건
한계점이 명확하다는거지.
이걸 해소하기 위해서 프로그램은
시드 값 자체를 외부에서 가져온다.

예시로서는 시간이 대표적인데
2022년 12월 13일 4시 9분에 이 글자를 썼는데
글이 올라가는 시점은 또 시간대가 다를 거임.
시간을 기준으로 시드를 설정한다면 매번 시드도 바뀌겠지.

다만 이렇게 시간만 기준으로 삼으면
강화가 잘 붙는 특정 시간대가 생길 수도 있잖아?
그러면 접속 ip, 캐릭터 고유 코드 등을 변수로 삼아서
시드가 똑같이 나오지 않게 설정을 해주는 게 일반적인 게임임.

개인적으로는 로아에서 시드가 한번 정해지면
다시는 안 바뀐다고 믿는 게 딱 하나 있는데
그게 바로 돌깎임.
그래서 나는 돌 태생 론을 열씨미 믿는다...


잡담은 내려놓고 다시 돌아가보자.
이번 상황처럼 두 가지 결과만 나온다?
그렇다면 시드 생성 단계에서 꼬인 게 아니라
시드로 난수를 만드는 단계에서 문제가 있었을 가능성이 있음.
무슨 이야기냐 하면

외부 변수->시드->난수->결과값(카드 종류, 강화 성공여부 등)으로 구분해서 봤을 때

A와 B가 똑같은 시드가 나왔다.
라고 하면 전카팩을 5장 깠을 때
완전히 똑같은 순서로
광잃쿠, 니나브, 카마인
이렇게 떠야함.



그런데 이번사태는 시드로 나온 난수가 이상한거임.
56을 가지고 난수를 만들었는데
5577557755775577이렇게 계속 100개 이상 결과물이 나온 거임.



그래서 일반적인 랜덤 생성 관점에서 보면
이번 상황은 굉장히 묘한 게 맞다.


물론 개발자 측에서 이야기를 해보자면
게임에서 최대한 공평한 랜덤을 원할 경우
난수에 따른 결과 값을 그대로 쓰는 것이 마냥 좋은 방법이 아닐 수도 있음.
가성비가 좋아서 난수 생성할 때 자주 쓰는 선형합동법 조차도
생성되는 수의 분포가 고르지 않다(= 특정 수에 몰려 나올 수 있다)라는 단점이 있긴 하거든.
그래서 로아가 워낙 잡탕코드인 것도 있고 하니
난수 분포를 평탄화 하다가, 혹은 참조를 하다가 꼬여서 생긴 버그다
라고 이야기 할 수도 있긴 함.

+참조하다가 꼬여서 생긴 버그라는건 대략 이런 이야기임
원래 시드를 만들기 위해서 A, B, C, D, E라는 외부 변수를 참조한다고 가정하자
그런데 E라는 외부 변수를 꼭 가져와야하는데, 그걸 오류로 못가져온거임
그것 때문에 시드 자체가 제대로 형성되지 않고,
이 때문에 난수 자체가 제대로 안 만들어 졌는데
아무튼 뽑기는 해야 하니까 대충 비슷한 거 아무거나 가져와서
그걸 난수처럼 취급하고 뽑기를 한거지.

비유하자면
내 마음대로 해산물을 골라서 넣는 해물쟁반짜장이 있다고 하자
그래서 새우, 오징어, 전복, 해삼을 골랐는데
주방 직원이 보니까 해삼이 다 떨어져서 없는거야.
그런데 주방 직원이 이걸 가지고 "사장님! 저희 해산물이 없어요!" 라고 말했고
사장은 "해산물이 없다고? 그럼 급한대로 유니짜장이라도 만들어서 내!"
라고 답변해서 해물쟁반짜장은 온데간데없고
유니짜장이 대신 나간 그런 느낌이라고 보면 되겠다.

즉, 버그로도 설명이 가능한 현상이라는 말임.


다만 한편으로는
시드 값을 구했으면 그냥 선형합동법으로 난수 뽑으면 되는데
대체 무슨 짓을 해놨길래 중간에 꼬여서 결과 값이 고정됨?
그것도 대부분이 그런 문제를 겪는 것도 아니고 극소수만?
이거 확률 주작 가능성 있는 거 아니냐?
라는 의심을 하는 것도 충분히 이해할만하다는 게
이번 상황의 쟁점이라고 보면 될 것 같다.

버그가 발생한 대상이 너무 적은 것도 있고
이런 상황을 버그 이외의 방식으로도 구현이 가능한 것은 사실이다 보니
게임이 랜덤이라는 방식으로 공평함을 보여주는 상황에서
의심할 수 있는 건수가 나왔다 자체가 신용의 문제로 번지기 쉬운 것도 맞음.
그러다 보니 의심하는 사람이 프로그래밍을 아냐 모르냐를 떠나서
의심을 하는 사람을 마냥 나무라기도 애매함.



이전 글에서 개발자들이 고생한다고 해서
결과물 안 나오는 게 정당화 되는 건 아니라고 엄청 깠는데...
이거 해명하고 수습하는 건 고생 좀 할 것 같음...