안녕하세요.
드디어 실전입니다. 정말 완벽한 추첨을 진짜 진행해볼까요.

1. 위 그림을 가만히 보시면, 룰렛을 돌려서 나오는 아이템 가치가 다 다르게 보이시지요?
x100, x1000 과 같이 잭팟이 있고 심지어 잭팟확률까지 1%라고 떡하니 써있네요.
결국 무작위로 공정하게 1/8의 확률로 나오는게 아니라 룰렛 안에서 조작되서
꽝이 많이 나오고, 잭팟은 잘 안나오게 되겠지요.
2. 정말 공정한 것은 미래를 알 수 없는 어떤 자연현상이나
주식가격 같은 것이라고 생각하시는 분도 계시겠지만,
- 예전 화이트 크리스마스(12/25일에 눈이오면) 또는 아닌경우를
맞추는 사람에서 선물을 주는 이벤트나 스포츠 토토 같은
미래에 일어날 일을 추첨에 사용하는 경우가 있는데,
승부조작가다가 걸리는 사건이 종종 있는 것을 보면 당연히 조작이
가능하다는 것을 알 수 있을 것입니다.
- 주식가격 역시, 주가 조작하다가 걸리는 것 많이 보셔서
충분히 조작이 가능하다는 것을 아실 것 같고요.
- 지난 편에 말씀드렸지만 이런 분야에 최고봉은 '양자난수' 입니다.
그런데, 양자난수는 정말 조작불가능한 무작위라고 하더라도
문제는 이 결과를 믿을 수 있을까요?
양자난수 주사위가 하필이면 내가 판돈을 높게 제시한 딱 그순간에,
이상하게 1만 연속으로 10번 나왔다면 믿을 수 있을까요? (전달 서버 등에서 조작 가능)
3. 이제 정말 완벽하고 공정한 룰렛을 돌려봅시다.
- 참가자 : A, B, C 세명
- 룰렛 : 1~6까지 주사위처럼 6칸으로 구성
- 돌리는방법 :
1) A, B, C 각자 종이에 룰렛을 몇칸 돌릴지 (=Spin)
아무도 모르게 종이에 적어 박스에 넣는다. (1~6중에 선택)
예) A=3, B=5, C=1을 적었다고 가정하자
2) 모두 박스에 종이를 넣은 것을 확인하고. 절대 조작할 수 없는 상태에서 3장을 모두 공개한다.
3) 각자 적어낸 숫자만큼 룰렛이 돌아가서 최종 숫자를 결정한다.
(모두 더하되, 원형이므로 6을 넘어가면 다시 1,2,3 순서대로 진행)
예) A가 3을 냈으니, 3 진행 = 1,2,3
B가 5를 냈으니, A가 돌린 3에서 5칸 진행 = 4,5,6,1,2
C가 1을 냈으니, B까지 돌린 2에서 1칸 진행 = 3
- 당첨자 결정 : 최종 당첨 숫자 3을 적어낸 사람이 당첨. 없을경우 가장 근접자 (중복일 경우 둘다)
자, 이런 방법이면 종이를 바꿔치기하거나 다른 조작을 못한다고 가정했을때
완벽한 추첨이라고 할 수 있겠죠?
저는 C이고 A,B가 저를 골탕먹이고 당첨금을 나눠 가지려고 아무리 모의하고 담합을 하더라도
(심지어 10.000명중 9,999명이 담합해도), 단하나의 내가 결정한 숫자하나로
최종 결과가 완전히 뒤집히고 결정되기 때문에
나는 이결과를 100% 믿을 수 있게 되는 것입니다.
3. 이제 온라인에서 이를 구현하려면 어떻게 할까요
- 각자가 제출하는 값을 암호화해서 모두가 볼수있게 공개해서 제출한다.
제출시 봉인되고 공개되기 때문에 절대 수정이 불가.
- 마감까지 Time Lock이 걸리고, 마감후 (이미 암호화되서 공개된 모두의 Spin 값들을)
봉인을 자동으로 해제하고,
모두의 Spin을 더해서(룰렛을 굴려서) 최종 숫자를 결정한다.
이제 곧 테스트 추첨을 실제로 진행해 보겠습니다.
당첨되신 분께는 소정의 사은품을, 이 로직이 불완전함을 입증하시는
분께는(조작을 통해 본인이 당첨된다든가 함을 증명) 엄청난 사은품을 드릴 생각입니다.
100번째 룰렛돌리면 당첨되게 하는것도 방법이죠
a = 1, b = 3, c = 6 => 1, 2,3,4, 5,6,1,2,3,4 => b
a = 2, b = 3, c = 6 => 1,2, 3,4,5, 6,1,2,3,4,5 => c
a = 3, b = 3, c = 6 => 1,2,3, 4,5,6, 1,2,3,4,5,6 => c
a = 4, b = 3, c = 6 => 1,2,3,4, 5,6,1, 2,3,4,5,6,1 => c
a = 5, b = 3, c = 6 => 1,2,3,4,5, 6,1,2, 3,4,5,6,1,2 => b
a = 6, b = 3, c = 6 => 1,2,3,4,5,6, 1,2,3, 4,5,6,1,2,3 => b
b와 c가 모의하게 되면 a가 승리할 확률은 없습니다. 멍청한 모의자들의 경우를 볼까요?
a = 1, b = 2, c = 5 => 1, 2,3, 4,5,6,1,2 => b
a = 2, b = 2, c = 5 => 1,2, 3,4, 5,6,1,2,3 => a,b
a = 3, b = 2, c = 5 => 1,2,3, 4,5, 6,1,2,3,4 => a,c
a = 4, b = 2, c = 5 => 1,2,3,4, 5,6, 1,2,3,4,5 => c
a = 5, b = 2, c = 5 => 1,2,3,4,5, 6,1, 2,3,4,5,6 => a,c
a = 6, b = 2, c = 5 => 1,2,3,4,5,6, 1,2, 3,4,5,6,1 => a,b
공모를 이상하게 했더니 a가 승리할 확률이 확 올라갔네요. 공평하다는 것은 확률이 유니폼한 분포를 따라야한다는 것과 같습니다. 정말로 유니폼한 분포를 가지려면 공모를 했던 안했던 완벽히 동일한 확률을 가져야 합니다. 결국 당첨번호가 (a+b+c)%6 이라는 건데 (0=6), a가 무엇을 선택했든, (b+c)%6 만큼 쉬프트 된 수가 당첨번호가 되는 겁니다. 그러면 a가 가장 싫은 쉬프트되는 경우는 3이겠지요. (정 반대편의 번호를 선택하게 되니까) 그러면 당첨확률이 없어지게 됩니다. 반대로 (2+5)%6은 1만큼 쉬프트된 것이니, b와 c의 번호가 a와 붙어있지 않게 되면 a의 당첨확률이 높아지게 됩니다.
이번에는 10000명 중에서 생각해보시죠. A에게 최악의 경우는 나머지 공모자들의 룰렛의 크기의 절반만큼 쉬프트되는 경우입니다. 그리고 적당히 떨어지면서 분포하는 겁니다. 어차피 A만 떨어뜨리면 되니까요.
진짜 우연치 않게 지나가다 본 거라, 더 자세히 말씀 드리진 못할 것 같습니다. 제가 보기에는 암호학적 해시 함수를 이용해서 모든 참여자가 씨딩을 하고 해시 함수를 계산해서 나온 결과를 숫자로 변환해서 모듈러 연산을 하는 것이 훨씬 나은 분포를 보일 것입니다. 암호학적 해시의 요구 조건 중 하나가 1비트만 바뀌어도 전체 50%의 비트가 바뀌어야 한다는 것이 있거든요.
그래도 생각만 하는 것과 실천 하는건 다르니 잘 구현 하셔서 건승 하시길 바랍니다