안녕하세요.


이번에도 잡다한 주제로 찾아온 저입니다. (_ _)


최근 글을 읽어보는데 카니타로의 3카드 뽑기의 원리가 

이미 만들어진 배열을 보여주는 것이라는 글이 있더라구요.


저의 생각은 랜덤으로 뽑히는 것이 맞을 것이다, 이에요.

왜 그렇게 생각하는지를 설명하는 글을 적어보면서

개발자의 입장에서 앱타/웹타의 원리를 살짝 적어볼까 하여 오랜만에 왔습니다.



* 이 글은 자동 카뽑의 원리와 구현방식에 대해서 다룹니다.

원리와 구현 방식에 대해서 관심이 없으신 분께서는 

결론만 읽으시면 좋습니다. *



1. 컴퓨터의 랜덤은 진짜 랜덤이 아니다


랜덤이란 사건이 계속하여 발생할 때

사건들 사이에 규칙성이 없는 경우를 말합니다. (= 무작위)


그리고 우리는 타로 카드를 자동으로 뽑을 때(앱타/웹타) 

무작위로 뽑히기를 기대합니다.


하지만 컴퓨터는 그저 성능이 좋은 계산기일 뿐입니다.

어떠한 정해둔 규칙(알고리즘)을 주고, 값을 넣으면 

규칙에 따른 결과를 알려주는 성능 좋은 계산기일 뿐이죠.


하지만 랜덤, 즉 무작위는 규칙성이 존재하면 안 되기에

컴퓨터로는 진정한 무작위 선택을 할수 없습니다.


그래서 '의사 난수' 라고 하는 알고리즘을 사용하게 됩니다.


의사 난수란 사람처럼 무작위로 수를 선택하지는 못하지만,

최대한 비슷하게 흉내내는 알고리즘(규칙)을 의미합니다.


실제 알고리즘에 대해서 궁금하신 분께서는

아래 참고한 글(링크)를 보시면 좋을듯 합니다.



(이 부분은 관련 지식이 있는 분만 읽으시는걸 권장합니다)


[추가내용 : AI 기술로도 진정한 무작위를 만들지 못하는 이유]

세상의 모든 작업을 이분법적으로 나누어 보면 이렇게 분류될 수 있습니다.


컴퓨터로 가능한 작업 / 컴퓨터로 불가능한 작업


여기서 컴퓨터로 가능한 작업은 당연히 사람이 할수 있는 작업이며,

컴퓨터로 불가능한 작업 중에는 사람만이 할수 있는 작업이 넘쳐납니다.


사람은 규칙을 주면 그 규칙에 맞추어 답을 낼수 있습니다.

컴퓨터도 규칙을 주면 그 규칙에 맞추어 답을 낼수 있습니다.


하지만 답을 주고 규칙을 찾아내는 것은 어떨까요?


사람은 답을 주면 규칙을 찾아낼 수 있는 존재입니다.

컴퓨터는 그러지 못합니다.


기술이 발달하기 전을 예시로 들어본다면, 어느 사진이 고양이인지 맞히는 작업이 있을 것입니다.

컴퓨터는 규칙을 주어야 답을 낼 수 있는데- 


어떤 것이 고양이이고, 어떤 것이 아닐까요?

몇가지 규칙으로 완벽하게 분류할 수 있을까요?


가령 '고양이는 네 다리를 가진 것이다' 라는 규칙을 준다고 한들,

분명 세상에는 세 다리만 가지고 있는 고양이도 있을 것이기에 완벽하게 분류해낼수 없습니다.


그래서 사람들은 컴퓨터가 사람의 두뇌처럼 동작할 수 있도록 하고 싶어했으며

사람만이 할 수 있었던 작업을 컴퓨터도 가능하도록 만들고 싶었습니다.


그 결과가 흔히 말하는 머신 러닝, AI입니다.

여러 머신 러닝 기법들 중에는 인간의 뉴런 시스템을 모방한 딥 러닝이 있는데


기사나 뉴스에서 종종 접하게 되는 AI, 딥러닝 등의 개념은 이런 내용에서 나온 것입니다.


사람처럼 답만 주어도 규칙을 알아서 찾아내도록 하려는 시도인 것이죠.


그렇기에 AI로도 아직까지는 완벽한 랜덤을 구현할 수 없는 것입니다.

머신 러닝은 어떠한 규칙을 찾아내려는 것이 목적이고,

무작위와 규칙성은 양립할 수 없기 때문입니다.

(여기까지)



2. 컴퓨터에서의 랜덤 구현


저희는 지금까지 컴퓨터로는 완벽한 무작위 선택을 할 수 없다는 것을 알게 되었습니다.

그렇다면 실제 앱타/웹타에서는 어떻게 자동으로 3카드 선택을 해줄까요?


어떤 값을 정해진 규칙에 넣었을 때, 그 결과가 최대한 무작위여야 하므로

(여기서 규칙은 '값이 들어오면 100을 곱해서 3으로 나눈다' 같은 규칙입니다.)


보통은 넣는 값이 자동적으로 바뀌도록 세팅을 합니다.


넣는 값이 규칙성을 띈다면 결과도 규칙성을 띌 것이니까

현재 시각같이 불규칙한 값을 넣곤 합니다.


지금의 시간은 다시 돌아오지 않기 때문입니다.



원리가 꽤나 복잡하단 생각이 듭니다, 그렇지만 실제 개발자가

랜덤선택 기능을 프로그램에 넣고 싶을 때에는 어떻게 하면 될까요?


매우 간단합니다. 


대부분의 프로그래밍 언어(앱타/웹타를 만들기 위해 사용)는

기본 기능으로 이런 랜덤 선택을 갖추고 있습니다.


그러니 개발자의 입장에서는

타로 앱타/웹타의 경우 미리 조합을 저장해두고 내보내는 것보다는


간단하게 랜덤선택을 하도록 하는게 편합니다.


제가 자주 쓰는 '파이썬' 이라는 프로그래밍 언어를 보면

'random()' 단어 하나로 무작위 선택이 끝납니다.



a15714ab041eb360be3335625683746f07534521d6a7e3890b9df62c37a1c32f3c387842aac3c47dbe526e79923769ccf69d6177514f


저는 위처럼 자동 3카드 선택 프로그램 등을 만들어본 경험이 있는데요,

위의 프로그램을 활용해서 타갤 리딩/카뽑도 여러번 했었습니다.



a15714ab041eb360be3335625683746f07534521d6a7e3890b9df62c37a1c32f3c38784daac5c17dbe526e79923769cc75954c0a16e350


위의 프로그램 코드가

웨이트에서 3카드를 자동으로 뽑아주는 프로그램의 코드 일부입니다.


질문에 맞추어 세가지의 3카드 배열을 자동으로 만들어 두고,

1,2,3 중 하나를 선택하면 그 3카드 배열을 보여주도록 하는 것이죠.


개발자의 입장에서는

한두줄 코드를 작성하는 것으로

무작위 선택을 할 수 있다는 것입니다.



a15714ab041eb360be3335625683746f07534521d6a7e3890b9df62c37a1c32f3c38784caac4c47dbe526e79923769cc5cae3413ee66


위의 사진은 저 프로그램을 작동시켰을 때 보이는 화면입니다.



3. 결론


이러한 원리와, 이러한 방법으로


앱타나 웹타를 만드는 개발자가 카드 랜덤선택을 해 주게 됩니다.


개발자의 입장에서는

3카드 조합을 몇십 ~ 몇백가지를 미리 정해두고

정해진 배열을 알려주는 것이


랜덤으로 선택해서 알려주는 것보다 훨씬 번거롭습니다.



그러니 앱타나 웹타가 랜덤으로(제대로) 안 뽑아주는게 아닐까?

하는 걱정은 조금 내려놓아도 좋을 것 같습니다.




참고한 글 : 컴퓨터가 만드는 랜덤은 정말로 랜덤할까?


추신 :

제가 이 글을 쓰면서

카니 타로 사이트에 들어가서 사이트 소스코드(php, js)를 좀 뜯어봤는데요,

자동으로 카드를 선택해주는 기능이 있는 소스코드는 숨겨두어 직접 확인은 못 했지만


카니 또한 비슷한 방식으로 자동 선택 기능을 구현했을 것이라 생각합니다.


10