걸러진 무작위성 사용하시나요?

게임의 인공지능에 관한 포럼입니다.

Moderator: 류광

Locked
xpsEngine2
Posts: 32
Joined: 2007-02-06 23:37

걸러진 무작위성 사용하시나요?

Post by xpsEngine2 »

걸러진 무작위성(filtered randomness)은 게임안의 무작위적인 의사결정이나 사건이
플레이어에게 정말로 무작위적으로 보이도록 만들려고 한다.
이를 위해, 난수 발생기가 발생시킨 난수들에서 그다지 무작위적으로 보이지 않는 수열은 제거하되
통계적인 무작위성은 유지하는 식으로 필터를 적용한다,
예를 들어서 동전을 여덟번 던졌는데 모두 앞면이 나왔다면 플레이어는 동전이 좀 이상하다고 생각할것이다.
실제로 동전을 여덟번 던졌을때 모두 앞면이 나올 확률은 0.4% 에 불과하지만
동전을 100번 던지는 경우에는 여덟번 연달아 앞면이 나오는것도 별로 놀랄일이 아니다.
(AI Game Programming Wisdom 2권에서)

=============================================================

걸러진 무작위성에 대해서 크게 생각하지 않았지만, 몇가지 경험을 하면서
무작위(random) 에 대해서 생각하게 되었습니다.

사례1:
아이템의 드롭확율을 말 그대로 "랜덤" 하게 설정하였습니다.
문제는 서버가 오픈하고 몇일뒤에 발생하였습니다.
운영팀과 기획템에서 DB 와 로그를 보면서 발생하였습니다.

하루는 다음과 같이 말했습니다.
-> 이상하네... 이쯤되면 레어아이템 하나 떨어질때가 되었는데 왜 안떨어지지?? 랜덤이 제대로 돌아가나?

그렇게 일주일이 지나고 일이 발생하였습니다.
-> 이것봐 큰일났어, 레어템이 갑자기 7개가 떨어졌어!!! 무슨일 있는거 아니야?

원래 원하는 확율은 하루에 하나씩 떨어지는것이지만 이렇게 되었습니다.

원인분석:
결국 원인은 랜덤값이 고르지 않다는것에 착안하여
랜덤함수를 고쳤습니다. 시퀀셜하게 랜덤함수를 고쳐서 어느정도 카운터가 누적되면 반드시
레어템이 떨어지고 레어템이 떨어지면 다시 카운터를 리셋하는 구조였습니다.
실제로 시뮬레이션결과 고르게 템이 떨어졌습니다.

사례2:
랜덤함수를 적용하고 문제가 발생했습니다. 랜덤함수 자체가 시퀀셜한 구조이기 때문에
서버를 끄고 켤때마다 카운터는 0 으로 시작하기 때문에 서버를 자주 끄고 켜는 날에는
레어템이 떨어지지 않았습니다. 서버에 버그가 없으면 좋겠지만 그게 마음대로 안되었고
결국 서버를 끄고 켜는것이 랜덤에 영향을 주었습니다.
(시퀀셜을 바꾸는 방법도 있지만, 서버시작 직후 레어템이 떨어지는 문제로 인하여 사용 못했습니다.)

사례3:
인첸트의 성공확율은 50% 입니다. 큰 문제가 없었습니다. 하지만 운영팀에 접수된 버그리포팅에는 다음과
같은것이 있었습니다.

"분명 아이템 인첸 확율이 50% 인데 아이템 6개 질렀는데 6개 다 날아갔다."

물론 확율이란것이 10개 질러서 10개 날아가는것도 확율의 일부이지만, 유저 입장에서는
"버그" 로 보일수도 있다는것을 알았습니다. 결국 인첸확율을 "개인별로 따로" 관리해야하는것이 아닐까?
하는 의견까지 나왔습니다.

결국 문제는 다음과 같습니다.

1. 순수한 랜덤함수를 사용하면 하루걸러서 불평이 나온다.
-> 왜 아이템 안떨어지지? 왜 오늘은 아이템이 2개 떨어지지? 왜?왜? 왜?왜? 오늘은 이러지?

2. 랜덤함수에 필터를 사용할경우 서버다운과 같은 사태에 대응하지 못한다.

3. 랜덤이라는것은 무작위성이 있어야 하지만 한편으로는 "공평" 해야 한다.

결국 "걸러진 무작위성" 은 양날의 칼이지만 어떻게 통제를 하지 못하는데,
아이템의 드롭을 고르게 하면서도 예측불가능하게 하는 방법에는 어떤것이 있을까요?
GameMania
Posts: 199
Joined: 2008-08-08 11:26

Re: 걸러진 무작위성 사용하시나요?

Post by GameMania »

xpsEngine2 wrote: 결국 "걸러진 무작위성" 은 양날의 칼이지만 어떻게 통제를 하지 못하는데,
아이템의 드롭을 고르게 하면서도 예측불가능하게 하는 방법에는 어떤것이 있을까요?
서버에 기록을 남기면 되지 않나요??
하루에 몇번째 몹을 잡는놈이 레어를 획득한다던지..
park
Posts: 189
Joined: 2008-07-30 09:04
Location: bandi

Post by park »

보통 mp3 플레이어에는 랜덤 재생이라는 기능이 있는데, n 개의 재생목록중에서
다음에 재생할 곡을 랜덤함수로 결정하면 사람들이 싫어합니다.

좀전에 나온곡이 다시 나올수도 있고, 바로 이전에 나온곡이 또 나올수도 있다는거죠.

그래서 쓰는 방법은 랜덤이 아니라 셔플을 사용합니다.
n 개의 배열이 있으면 카드 섞듯이 랜덤 함수를 이용해서 두개의 위치를 스왑시키는거죠.
그걸 여러번 실행시킨후 n개의 배열에서 순서대로 재생하면 사용자가 만족할만한
랜덤(셔플) 재생이 됩니다.

아이템 드롭도 이런 방식을 사용하면 될듯하네요.

레어 아이템은 1 아닌건 0 이라고 할때

10000000000000100000000000000000100000000000000001000000000000

의 순서로 드롭되면 예측가능한 결과가 나오지만 이 배열을
적당히 셔플을 시킨후 순서대로 적용하면 원하시는 결과를 얻을 수 있을듯 합니다..
Rica
Posts: 86
Joined: 2004-08-09 08:27

Post by Rica »

인챈트의 경우 과거 결과에 영향을 받게 하면,
엄청 싼 아이템을 5번 연속 실패할 때까지 계속 인챈트한 후
비싼 아이템을 인챈트하면 성공확률이 높아지니-_-;
그런 걸 이용하는 유저들도 있다 들었습니다.
GameMania
Posts: 199
Joined: 2008-08-08 11:26

Post by GameMania »

Rica wrote:인챈트의 경우 과거 결과에 영향을 받게 하면,
엄청 싼 아이템을 5번 연속 실패할 때까지 계속 인챈트한 후
비싼 아이템을 인챈트하면 성공확률이 높아지니-_-;
그런 걸 이용하는 유저들도 있다 들었습니다.
싼아이템은 기록이 필요없고, 비싼것만 해야겠지요 ^^
soryu
Posts: 204
Joined: 2003-12-12 22:59

Post by soryu »

싼건 안하구 비싼것만 하면 저~중렙들의 불만은 그대로면서..

고렙들은 특혜? 를 보게 되는것 아닐까요ㅎㅎ
비회원

Post by 비회원 »

비회원인데 글 남겨도 될지 모르겠지만

인챈트 같은 분야는 순수 랜덤이 적용되야 하는게 맞는것 같아요.

싼걸 먼저 인챈시키거나(일명 제물) 특정 행위뒤에 하면 잘 된다더라 하는

징크스적 요소가 워낙 많아서
GameMania
Posts: 199
Joined: 2008-08-08 11:26

Post by GameMania »

soryu wrote:싼건 안하구 비싼것만 하면 저~중렙들의 불만은 그대로면서..

고렙들은 특혜? 를 보게 되는것 아닐까요ㅎㅎ
오해가 있었군요.
레벨이 높은게 아니라,
해당 레벨에서 높은가치의 아이템이겠지요. ^^
Remisa
Posts: 290
Joined: 2006-07-10 02:25

Post by Remisa »

확률보정 카운터를 소유하는 객체는 최대한 하위 단에서 정해야 부작용을 피할 수 있습니다.

1.
강화 실패횟수 카운터는 플레이어당 하나 두지 말고
아이템마다 각자의 실패횟수를 기록해둡니다.
그에 따라 (해당 아이템의) 다음 강화를 시도할 때 숨겨진 확률 보상치를 약간 보태주되,
완벽한 공정함을 보여준답시고 유저가 체감할 만큼 많이 주면 안됩니다.
아이템의 소유자가 바뀌면 실패횟수를 리셋합니다.

여기서의 실패는 '강화는 실패했으나 아이템은 없어지지 않는다'를 뜻합니다.
아이템 파괴확률이 50%씩이나 설정된 경우에는 확률보정은 깔끔하게 포기해야 합니다.
(대신 유저가 울지 않도록 재료템이라도 몇 개 쥐어줍니다. - 던파처럼)

2.
레어템 드랍 카운터는 서버에 하나 두는게 아니고
플레이어마다 하나씩 줍니다.
어떤 플레이어가 레어템 드랍 확률이 있는 보스급 몹을 잡을 때마다 그 플레이어의 카운트를 증가하고
카운트가 많이 쌓이면 그 플레이어가 레어템을 얻을 확률을 높여줍니다.
플레이어가 레어템 획득에 성공하면 카운트를 줄이거나 리셋합니다.
(제가 카운터라 썼다고 말 그대로 카운터는 아닙니다. 점수 개념을 쓰는게 더 유연합니다.)
좀더 발전시키면 아이템 등급에 따른 확률보정도 시도할 수 있습니다.

역시 공정함에 지나치게 집착해서는 안되고,
'완전한 공정함'과 '완전한 무작위성' 의 중간 정도가 좋다고 생각합니다.
visco
Posts: 114
Joined: 2006-07-02 12:46

Post by visco »

Remisa wrote:2. 레어템 드랍 카운터는 서버에 하나 두는게 아니고
플레이어마다 하나씩 줍니다.
...
이렇게 할 경우 파티 사냥이나 전체 아이템 수의 통제를 할 때 문제가 되지 않을까요?

ex1. 보스전에서 좋은 아이템이 떨어지면 같이 파밍하던 모든 공대원의 럭키(..)점수 초기화
ex2. 개별적인 굴림 시 아이템 수 통제가 힘듬


p.s 쓰다보니 ex1같은 경우 보스 자신이 아이템을 안 뱉을 시에 해당 아이템의 떨굴 확률을
높이면 될 것 같군요
Remisa
Posts: 290
Joined: 2006-07-10 02:25

Post by Remisa »

visco wrote: 이렇게 할 경우 파티 사냥이나 전체 아이템 수의 통제를 할 때 문제가 되지 않을까요?
문제가 됩니다.
그리고 각 문제를 해결하기 위해 확률통계에 능한 디자이너가 한 명 필요합니다.
여기서 수학 얘기하긴 좀 그러니 아이디어 단계에서만 답해보겠습니다.
visco wrote: ex1. 보스전에서 좋은 아이템이 떨어지면 같이 파밍하던 모든 공대원의 럭키(..)점수 초기화
분배방식을 어떻게 하든 한 아이템이 두 명에게 가지는 않으니
그 아이템을 획득한 파티원 한 명의 점수만 깎습니다.
(또는, 모두 약간씩 깎되 그 한명만 더 깎는다는 식으로 합니다.)
아무리 파티원일지라도 남이 좋은 아이템 먹었다고 내가 눈에 띄는 보상을 받은 것은 아니니까요.
visco wrote: ex2. 개별적인 굴림 시 아이템 수 통제가 힘듬
파티가 구성되었을 때, 또는 멤버가 바뀌었을 때,
개별 파티원의 레어템 드랍율을 모아 파티 전체의 드랍율을 구성해놓고 시작합니다.
그러려면 공식이라던지 테이블이라던지를 만들게 되겠죠.
서버 전체의 아이템 수를 통제하기 위한 가중치가 필요하다면 이 때 넣습니다.

이렇게 파티드랍율을 사용하면 만약 이 정책이 유저들에게 유출되더라도
좋은 아이템을 못 갖춘 '거지 캐릭터'를 너도나도 파티에 끼워주려는 움직임을 유도할 수 있습니다.
부정적인 방향은 아닌 것 같아요.
단, 아무 일도 안하고 따라다니기만 하는(일명 '버스') 파티원들은 드랍율 구성에서 제외합니다.


그 전에 가장 먼저 해결해야 하는 일은
솔로잉 사냥에 대한 서버 전체 아이템 수의 통제문제입니다.
점수제-_-를 사용한 덕에 완전랜덤보다야 드랍 분포가 훨씬 고르게 나오긴 하지만
'하루에 하나!' 등의 완벽한 통제를 원한다면 계속 손봐야겠죠.
확률보정공식을 어떻게 잡으면 어떤 통계가 나올지 예측해놓고 치밀하게 적용한 다음,
결과가 예상보다 너무 어긋날 때는 확률 추가수정을 할 것인가 말 것인가도 생각해놓아야 합니다.
쉽다고는 안하겠습니다만 여기까지 성공하면 위의 두 문제도 쉬워질 겁니다.
visco
Posts: 114
Joined: 2006-07-02 12:46

Post by visco »

Remisa wrote:파티가 구성되었을 때, 또는 멤버가 바뀌었을 때,
개별 파티원의 레어템 드랍율을 모아 파티 전체의 드랍율을 구성해놓고 시작합니다.
그러려면 공식이라던지 테이블이라던지를 만들게 되겠죠.
서버 전체의 아이템 수를 통제하기 위한 가중치가 필요하다면 이 때 넣습니다.
...
이 가중치가 서버 인원에 따라 달라지는건 어떨까요?
가뜩이나 없는 인원에 아이템도 잘 안나오면 한 서버에 몰리는 현상이 심화되려나;
시간에 따른 가중치로 한다면 인원 적은 서버에서는 흔한 아이템이 되버릴테고..
다른 게임들에서는 어떤 방식을 적용중인지 궁금하군요
Remisa wrote:그 전에 가장 먼저 해결해야 하는 일은
솔로잉 사냥에 대한 서버 전체 아이템 수의 통제문제입니다.
점수제-_-를 사용한 덕에 완전랜덤보다야 드랍 분포가 훨씬 고르게 나오긴 하지만
'하루에 하나!' 등의 완벽한 통제를 원한다면 계속 손봐야겠죠.
...
역시 지속적인 프로파일링 및 보정만이 답이겠군요.
좋은 답변 감사드립니다 :)
Locked