최근 수정 시각 : 2024-10-29 21:36:53

난수조절

1. 개요2. 유형
2.1. 리셋 노가다2.2. 난수고정2.3. 입력값 조절
2.3.1. 조작에 의한 동일 난수 재현2.3.2. 플레이어 입력 타이밍의 고정
2.4. 기타
3. 관련문서

1. 개요

비디오 게임에서 연산에 따라 생성되는 난수생성을 조절하는 행위. 실제로 행해지는 수단들을 감안하면, 엄밀히 말하자면 시드 조절, 혹은 시드 통제 행위라고 볼 수 있다. 난수조정(乱数調整)이라고도 한다.

게임에서는 상황에 따라 어떤 커맨드를 입력하거나 할 때 그 결과가 무작위적으로 나오거나 특정한 확률 내에서 이벤트가 발생하도록 해야 할 때가 있다. 이러려면 난수를 사용해야 하는데, 난수 항목을 보면 알겠지만 난수란 랜덤하게 생성되는 이다.

허나 프로그램의 동작은 결정론적이므로 '진정한' 난수를 생성하는 것은 외부의 엔트로피가 없는 순수 알고리즘 만으로는 불가능하다.[1] [2] 그래서 프로그램은 난수가 필요하면 입력된 수치 중 어떤 수[3]를 어떤 수식에 넣어서 무작위하게 보이는 수를 생성한다. 그리고, 여기에 필요한 '어떤 수'는 언제 어떤 버튼이 눌렸는지 같은 조작하는 사람이 무작위하게 하는 행동에서 가져와서 결과값이 무작위하게 나오게 한다.

겉보기엔 난수 같지만 사실은 법칙이 정해져 있는 이러한 것을 유사난수, 혹은 의사난수(擬似亂數/pseudorandom number)라고 하며, 유사라는 이름을 보면 알겠지만 완벽한 무작위가 아니기 때문에 결국은 어떠한 패턴을 발견할 수 있다. 다만, 일반적인 플레이에서는 이를 일일이 생각하면서 조작하는 사람이 없기 때문에 실질적으로 난수가 될 수 있는 것이다. 그런데…….

이 패턴을 알아낼 수만 있다면 특정한 결과를 도출해 낼 수 있다는 결론에 도달한 폐인플레이어들은 갖가지 방법을 사용하여 자신이 원하는 결과를 얻으려고 하는 것을 통틀어 난수 조절, 혹은 난수 조정이라고 하는 것이다.

육성 시뮬레이션 게임, SRPG, RPG 등 일반적으로 입력값에 따라 결과가 달라지거나 사행성, 흔히 말하는 뽑기 시스템이 있는 게임에서 주로 행해지는 방법이나, 입력값에 영향을 끼칠 수 있고 그에 따라 특정한 결과가 나올 수만 있다면 장르 불문하고 행한다.

의사난수가 큰 반복쌍을 거쳐서 동일한 숫자들이 무한 반복되는 것은 맞다. 그렇지만 소프트웨어적 측면에서 아무리 저수준의 의사난수라고 해도 사람이 반복되는 주기를 알 수 있기에는 지나치게 크다. 결국, 소프트웨어 이용자가 난수를 예측하려는 행위는 의사난수의 초기 시드를 동일하게 맞추거나 동일한 시드에서 같은 횟수만큼 뽑아쓰도록 통제하는 것.

2. 유형

유형이라고 하지만 이것들이 명확하게 나뉘어 있는 것은 아니며, 대부분 비슷비슷한 의미를 공유하고 있는 경우가 많다.

2.1. 리셋 노가다

말 그대로 원하는 조건이 나올 때까지 다시 하는 것을 반복하는 것.

두 가지 경우가 있는데, 첫 번째는 뭔가를 해서 실패하면 그냥 다시 시작해서 똑같은 행동을 반복하는 것, 두 번째는 다시 시작해서 다른 방법을 시도하는 것이다. 이는 위에 언급한 유사난수가 어떤 알고리즘을 사용하느냐에 따라 같은 행동을 했을 때 결과가 다를 수도, 같을 수도 있다. 가장 유명한 리셋 노가다의 대표 게임은 슈퍼로봇대전 시리즈. 자세한 것은 항목을 참조.

2.2. 난수고정

일부 게임은 턴이 시작될 때나 스테이지가 시작될 때 이미 난수 시드가 고정되어 아무리 반복해도 같은 결과가 나오는 경우가 있다. 이렇게 되면 '몇 번째에 나오는 값이 무엇이다'라는 것이 무조건 정해져 있는 셈이다. 이런 경우엔 리셋 노가다를 해봤자, 확률이 떡 하니 퍼센트로 떠 있고 그 확률이 매우 높은데도 불구하고, 실패가 반복되는 경우도 있다. 써 있기는 80%니 95%니 써 있지만 결과는 뭐... 순진한 플레이어들은 저 숫자를 믿고 오늘도 하염없이 리셋 버튼을 누르고 있는 것이다. 이를 흔히 난수 고정이라고 부른다.

컴퓨터로 '확률'을 판정하는 방법은 간단하다. 예를 들어 성공확률이 80%라고 하면 1과 100 사이에서 숫자를 하나 뽑은 다음 그 숫자가 80보다 컸느냐 작았느냐를 가지고 성공·실패를 결정하는 식이다. 이러한 방식이니 난수 시드가 동일하다면 언제나 같은 결과를 얻게 된다.

보통 세이브시에 난수값이 고정되거나 턴이 시작할 때, 혹은 특정 행동을 시작할 때 난수 시작값이 입력되어서 난수가 항상 같게 나오는데, 특히 고전 게임으로 갈수록 이런 현상이 심하다. 같은 행동을 해도 결과가 달라질 정도로 그럴 듯한 난수를 발생시키려면 계속 난수 시작값을 달리해야하는데, 고전 게임들을 돌리는 머신들은 이러한 랜덤 노이즈 소스가 빈약하다. PC만 되어도 보통 현재 클럭 타이머(시스템 시간)을 가져다 쓰지만 귀찮은 개발사들, 혹은 디버깅을 용이하게 하고 싶은 개발사들은 적당한 선에서 난수처럼 보이도록 만드는 것인데, 난수 시작값을 자주 입력하지 않아 난수 '고정'이라고 불릴 정도의 고정된 결과값이 나오는 것이다. 혹은 난수인척 하고 그냥 정해진 경우가 있다. 그거 사기잖아

이럴 경우에는 위에서 언급한 것과 같이 '입력값'을 다르게 해 봐야 한다. 예를 들자면,
  • 다른 행동을 하거나 행동을 더 하거나 덜 한다. 예를 들어 무기를 바꿔서 공격하거나, 이동을 한 번 하고 공격하거나 하는 식으로. 경우에 따라 아무 의미 없는 뻘짓이 입력값을 다르게 하여 좋은 결과가 나오게 하기도 한다. 아니면 뜨는 확률을 믿지 말고 다른 놈을 쳐 보는 것도 방법.
  • 순서를 바꿔서 해 본다. 삼국지 시리즈를 예로 들자면 관우 장비가 여포를 공격할 때 관우가 먼저 치고 장비가 나중에 치면 삑사리가 나는데 장비가 먼저 치면 크리티컬이 들어가거나 하는 식이다.

파이어 엠블렘 시리즈가 악명이 높다. 난수도 생성 안하는 우연을 가장한 필연이기 때문에 맵에서는 세이브·로드고 뭐고 없으며, A라는 행동의 결과는 늘 B이다. 즉 적 턴에 잘 버티다가 마지막에 크리티컬 맞고 아군이 죽을 경우, 그 결과는 리셋이나 로드를 동원한다고 해도 같다. 물론 스테이지 진행중에는 중간 세이브도 없고, 매 행동마다 자동적으로 세이브가 된다. 때문에 자기가 원하는 턴에서 리셋이 안되고, 리셋을 하려면 그 스테이지 자체를 처음부터 시작을 통해서 리셋 노가다를 해야 된다. 더군더나 캐릭터 레벨업 랜덤 스탯까지 고려하면……. 그래서 일본에서는 이 특정한 패턴을 알아내기 위한 처절한 몸부림이 발매 당시부터 계속되어 왔다.

시리즈에 따라서 난수고정인 작품이 있고 아닌 것이 있다. 슈퍼로봇대전 A 포터블에서 중단 세이브를 하는 순간 파이어 엠블렘처럼 게임 내부 난수가 고정돼서 무조건 행동의 결과가 고정된다. 아군 턴은 몰라도 적 턴일 때는 확실히 치명적인 요소. 사실상 리셋 노가다에 제한을 걸어 버려 파장을 일으킨 적이 있었는데, 반응이 별로 안 좋아서 이후 작품에선 다시 랜덤하게 되도록 변경되었다. 슈퍼로봇대전 R부터는 적 턴에도 세이브가 가능하게 변경. 마음만 먹으면 90%대의 공격을 연속으로 회피하는 기행을 보여줄 수도 있었다.

문명 시리즈에서도 똑같은 행동을 한다면 세이브 로드를 해도 결과는 똑같지만[4] 게임 셋업 때 랜덤 시드 항목에서 따로 설정을 할 수가 있다.

그 외에 삼국지 시리즈 SD건담 G제네레이션 시리즈도 대표적인 난수고정 게임이다.

엑스컴: 에너미 언노운 역시 난수고정 게임이다. 아마 서양 게임을 주로 플레이하는 유저들 중에서는 난수고정 게임 하면 이게 가장 유명할 듯싶다. 이 게임은 특히 모든 결정 단계에서 공격, 스킬 등의 성공률을 하단에 띄워주기 때문에, 높은 확률을 믿고 공격 결정을 했는데 빗나가서 고통받는 경험을 다들 해본다. 이 때문에 세이브로드 신공으로 사격위치, 이동 순서 등을 변경해 맞을 때까지 사격을 재시도하는 일이 잦았으며, 확장팩 엑스컴: 에너미 위드인에서는 아예 로드할 때마다 난수가 바뀌도록 하는 " 저장질"이라는 세컨드 웨이브 옵션이 생겼다. 고난이도 MOD 엑스컴 롱 워는 기본 골자는 본편을 따라가 저장질 세컨드 웨이브가 남아있다. 이 게임은 특히 아마추어 MOD인 데다 변동·추가 사항이 아주 많아 게임 자체가 불안정해졌기 때문에 본편을 플레이할 때처럼 세이브·로드 신공을 남발할 수가 없다. 게다가 복잡하고 대규모로 변한 전장 상황 때문에 한 번의 선택이 크게 전황을 좌우하기에 다이스 갓을 믿고 도박을 할지, 뒤로 물러나 다음을 대비할 지 결정해야 한다.

포켓몬스터에서는 루프라고 불리는 난수조절 행위가 존재한다. 그 외에도 에뮬레이터로 포켓몬 배틀시 세이브를 해놓을 경우 맞거나 회피할 공격, 크리티컬 여부, 몬스터가 볼에 잡힐 경우는 모두 그 시점에서 미리 정해지기 때문에 세이브·로드 노가다하려면 아예 포켓몬 조우전에 세이브를 해두어야 한다.

록맨 X5도 에니그마로 콜로니 낙하 성공률 100%로 난수고정을 할 수가 있다. #

젤다의 전설 1에서는 도박장에서 난수가 고정되어 있기 때문에 강제 세이브로 쉽게 루피를 벌 수 있다(...). 신들의 트라이포스부터는 수정.

2.3. 입력값 조절

2.3.1. 조작에 의한 동일 난수 재현

특정 단계에서 난수의 시드가 결정되고 그것이 유저의 조작에 의해 실행 가능할 경우, 해당 행동을 반복함으로서 그 다음 결과를 일정하게 할 수 있다. 예를 들면 특정 테크닉이나 이펙트가 실행될 때 코드상에서 시드를 몇으로 실행하는 랜덤 수열을 시작하고 이후에도 그것을 사용한다면 해당 테크닉을 돌리고 그 직후에 발동하는 랜덤숫자는 같은 결과를 내는 식이다. 동일한 방식으로 UI에서 어느 옵션창을 설정할 때, 어떠한 저장기능을 사용할 때 랜덤열을 재생성한다거나 하는 경우도 사용자가 매번 특정 상황 직전에 옵션을 열었다닫았다 하면 다음 결과물이 일정하기를 기대할 수 있는 원리다.

갑자기 아무 의미 없는 커맨드를 넣거나 갑자기 아무것도 입력하지 않는다던가 하는 등 겉으론 쓸데없어 보이고 이해할 수 없는 행동을 함으로서, 주로 적의 출현·행동패턴을 결정하거나 아이템의 낙템률을 늘린다거나, 즉사기·회피를 성공하려고 쓴다. 예를 들자면 턴제 RPG의 전투시 커맨드 입력에 텀을 두거나 커맨드를 입력하다 말았다 하거나 액션 게임의 갑자기 멈춤을 누르거나 잠깐 멈추거나 하는 등의 행위.

대부분 경험에 의해 나오는데, 흔히 말하는 '숨겨진 비기'라는 것이 이런 것으로 '그냥 때리면 일반 칼 주는데 캐릭터를 좌삼삼 우삼삼(...)한 후에 때리면 엑스칼리버를 주더라'류의 이야기다. 버그 플레이인 경우가 많다. 특히 난수가 간단하고 시간의 영향을 받지 않는다면 순서를 정확히 밟아 똑같은 난수를 굉장히 간단히 낼 수 있는 경우도 꽤 있어서, 난수 분석 등의 게임데이터 해석을 하지 않고도 사용할 수도 있다.

예를 들어, DS판 파이널 판타지 III의 오딘은 초저확률로 궁그닐을 드롭하는데(본래는 훔치기로 입수) 가까운 특정의 장소에서 세이브해 리셋하고 윈도우를 일정횟수 열었다 닫는 걸로 난수를 조작해 확실히 궁그닐을 드롭시키고 훔치기와 합쳐 2개를 입수할 수 있다. 혹은 파이어 엠블렘 시리즈에서 유닛 선택 후 커서 이동을 이리저리 삐뚤빼뚤하게 한다거나, 포켓몬스터 4세대[5] 및 5세대[6] 게임에서 페라페의 수다를 사용하는 것 등을 들 수 있다.

2.3.2. 플레이어 입력 타이밍의 고정

프로그래밍에 있어서 난수값의 시드로 가장 흔히 사용되는 것은 현재의 시간이다. 사실 컴퓨터가 측정할 수 있는 시간의 최소단위는 인간이 타이밍을 맞추거나, 심지어 프로그램 등으로도 재현하기 거의 불가능하므로[7] 얼핏 생각하면 정석적으로만 만든 난수 루틴은 사용자가 고정할 수 없는 것이 당연해 보이지만 실제로 많은 경우 난수값이 고정되는 게임들이 존재한다.

그 이유는 난수를 굳이 철저하게 방어해야겠다는 의도가 별로 없었을 경우 가장 많이 사용하는 시드 함수가 standard library(어느 플랫폼, 어느 컴파일러나 공통으로 제공하는 '국룰' 함수들)의 time 계열 함수이며, 이 함수는 1970년 1월 1일부터 현재까지 흐른 시간을 초단위로 리턴해주기 때문이다. 해당 코드는 찾아볼 수 있는 대부분의 자료나 예제에도 난수 초기화 코드로서 공통적으로 매우 많이 사용되며, (무슨 수를 써서든 찾아내겠다는 제3자의 개입만 없다면) 별 문제 없이 잘 돌아가 주기 때문에 여기저기에 쉽게 쓰인다. 특정 순간부터 N초 간격으로 특정 행동을 해서 난수조절을 하는 경우 이런 이유 때문에 난수값을 고정하는 것이 가능하다.

게임이 시작될 때의 환경이 동일하고 플레이를 완벽히 재현하는 방식의 난수조절의 경우, 프레임 단위로 조작이 일치해야 하므로 입력 타이밍에 인간의 손과 눈으로 조절하는 게 불가능에 가깝다. 하지만 외부 프로그램 등의 도움을 얻어 실현시키는 건 가능하다. 예를 들면 특정 커맨드를 프레임 단위로 정확하게 눌러야 하는 조작도 PC에서 에뮬레이터 스크립트 언어를 연동시켜서 사용하면 쉽게 가능하다. 혹은 그 스크립트마저 봉쇄되어 있는 경우(에뮬레이터가 아직 개발되지 않은 콘솔이라거나...)에는 아예 다른 하드웨어를 연결해서 물리적으로 제어하는 방법도 있다. 실제로 닌텐도의 포켓몬 시리즈 게임에서 난수고정을 하기 위해 아두이노와 서보모터를 게임기에 물려서 버튼 입력을 제어하는 방법이 나오기도 했고, Games Done Quick에서도 등장한 적 있는 TASBot은 게임기의 컨트롤러에 해당하는 부분만 에뮬레이팅해서 게임기로 직접 입력 신호를 전송한다. 예를 들어 슈퍼 마리오 3 의 경우 60Hz로 동작하므로 사람이 모든 조작 타이밍을 프레임 단위로 일정하게 하기는 어렵지만 기계나 프로그램을 사용한다면 16.6ms의 정확도 범위에서만 동일한 입력을 발생시키면 되기 때문에 충분히 가능하다. 이러한 스크립트화된 입력 플레이의 대표적인 예로 TAS가 있다.

굳이 TAS가 아니더라도 이 짓을 인간의 힘만으로 해내는 굇수들도 있으며, 난이도는 높지만 본래의 확률보다 좋은 결과를 낼 수 있는 가능성이 높아지기에 이걸 행하는 사람도 있다. 허나, 사람과 대전한다든가 하는 경우 유사난수를 난수로서 기능하지 못하는 측면이 있어 사용여부엔 찬반이 갈린다.

오락실 게임에서는 전원 패턴이라는 패턴 플레이의 일종도 있으며, 전원을 켠 후부터 특정한 시간에 정확한 커맨드를 입력하거나 조건에 맞는 타이밍에 어떠한 트리거를 실행해 원하는 결과를 도출하는 방법이다. 자세한 것은 항목 참조. 대표적으로 세가 테트리스의 테트로미노 출현 순서와 클레오파트라 포츈의 카운트스톱까지의 전원패턴, 배틀 가레가의 아이템 출현 순서 조절, 포켓몬스터 루프, 몬스터 헌터 시리즈 호석 호나이핑 등이 여기에 해당한다.

드래곤 퀘스트 9 가와사키 로커 지도는 둘다 해당된다. 이쪽은 유저들이 난수를 완전히 해독해서 정해진 대로만 하면 고급 아이템을 찍어낼 수 있다.

2.4. 기타

아예 난수해석(乱数解析)이라고 하여 알고리즘을 해석하여 게임 자체를 바꿔버리는 방법도 있다. 대표적인 것이 액션 리플레이.

그 외에도 게임을 더 잘 하고 싶은 욕망, 재미있게 하고 싶은 마음이 거의 미신에 가까운 속설을 믿는 경우도 많이 있다. 대표적인 것이 바로 WoW의 시드. 검증되진 않았으나 많은 사람들이 믿고 있다. 그리고 전설의 허경영 효과(···) 내 이름을 불러봐 넌 득템할 수 있고 게임 중에 나온 실수를 농담삼아 난수조절 한 거라고 변명하는 경우도 있다.

모바일 게임 프린세스 커넥트! Re:Dive에 등장하는 크리스티나의 능력이 바로 이 난수조절이다.

노 게임 노 라이프의 주인공인 『  』이 올드 데우스와의 특별한 주사위 게임, 정확히는 인생 게임 비슷한 게임에서 시도했다. 평소라면 주사위를 던지는 각도나 힘 등을 조절해서 원하는 눈을 나오게 할 수 있었겠지만 올드데우스에 의해 창조된 세계에서 주사위를 던져야 했기에 시도한 것. 게임이 끝날 때까지 효과가 있었는지는 결국 밝혀지지 않았으나 이 덕분에 이 양반들이 원래 세계에서 운이 필요한 게임을 할 때 어떻게 무패를 기록했는지 알 수 있게 되었다.

로또 등 복권의 추첨 시스템이 아날로그 시스템을 고집하는 것도 이 난수조절과 연관이 있다. 복권 추첨에서 난수조절을 허용하는 행위는 그 자체로 승부조작으로 직결되기 때문이며, 이는 곧 난수조절 허용 자체가 치명적인 설계 결함이라는 것이다. 실제로 미국의 한 프로그램인 'Press Your Luck'에서 이 설계 결함이 드러났었고, 이를 눈치챈 아이스크림 장수 마이클 라슨은 무려 11만 달러 이상을 챙기는 데에 성공하였다. 방송 당시 미국 근로자의 연 평균 소득이 25,000달러, 보통 집값이 5만 달러에 불과했던 점을 감안하면 엄청난 상금이다.( 참고 영상)

냥코 대전쟁의 뽑기 시스템에 존재하는 문제점이기도 하다. 냥코 대전쟁/평가 문서 참고.

3. 관련문서


[1] 멀티코어 프로세서에서 일어나는 스레드 경합 현상이 매번 동일하지 않으므로 순수 난수와 같은 것이라고 착각하는 경우가 있으나, 당연히 아니다. 그 발생원인은 커널에서 컨텍스트 스위칭을 하는 대상이 단일 프로그램으로 한정되어 있지 않고 그 컨텍스트 관리자 역시 외부의 동적인 환경에 노출되어 있기 때문이다. 게다가 이러한 '비 동일성' 이 난수로 쓰이기에 매우 부족한 것은 물론이다. [2] 하드웨어의 도움을 받으면 진짜 난수를 생성할 수 있다. 안테나 등을 통해 주변 노이즈를 입력받아 난수로 출력하는 칩 등. 다만 이것도 프로그램에 부속된 하드웨어의 제어권이나 접근 권한을 가지고 있으면 난수조절이 가능하다. 예를 들면 주변 노이즈를 입력받는 장치를 난수 조절용으로 쓰는 프로그램이 기동되는 하드웨어의 노이즈 센서가 장착된 위치에 특정 패턴의 노이즈를 발생시키는 또 다른 외부장치를 가져다 댄다거나. [3] 이 숫자를 '씨앗(Seed)'라고 하는데, 이 숫자가 동일하면 이후 난수의 순서가 동일하게 진행되게 된다. [4] 예를 들자면 정찰병이 유적을 밟아서 지도가 나왔다면 로드를 하더라도 같은 경로로 움직였을 경우 똑같이 지도가 나온다. [5] 포켓몬스터DP 디아루가·펄기아, 포켓몬스터Pt 기라티나, 포켓몬스터 하트골드·소울실버 [6] 포켓몬스터 블랙·화이트, 포켓몬스터 블랙 2·화이트 2 [7] 거의 모든 OS와 플랫폼에서 나노초 단위의 시간 측정 함수를 제공하고 있으며 별도의 소프트웨어가 개입하는 것 자체가 자신 스스로 CPU의 처리능력을 소모하는 행위이므로 그 결과에 예측할 수 없는 편차가 생기게 된다.