1. Fisher-Yates 셔플 알고리즘의 컴퓨터과학적 검증
오렌지 쿠지는 가상 상자(Box) 안에 들어있는 티켓 배열을 무작위로 섞기 위해 컴퓨터과학계에서 수학적으로 검증된 표준 Fisher-Yates 셔플 알고리즘(Knuth Shuffle)을 채택하여 사용하고 있습니다.
이 알고리즘은 유한한 요소의 배열(n개)이 있을 때, 모든 가능한 순열(n!)이 정확히 동일한 확률(1/n!)로 발생하도록 유도하는 알고리즘입니다. 시간 복잡도가 O(n)으로 매우 효율적이며, 무작위 셔플링의 바이어스(편향)를 완전히 배제하는 가장 완벽한 방법입니다.
// Fisher-Yates Shuffle Pseudocode
for i from n-1 down to 1 do
j = random integer such that 0 <= j <= i
exchange a[j] and a[i]
일반적으로 초보 개발자들이 작성하는 편향된 정렬(예: `arr.sort(() => Math.random() - 0.5)`)은 배열의 앞부분과 뒷부분 요소의 출현 빈도가 달라지는 통계적 불균형을 초래합니다. 오렌지 쿠지는 이러한 미세한 확률 편향마저도 원천 차단하여, 주최자나 특정 참여자 누구에게도 결과가 치우치지 않음을 수학적으로 엄격히 보장합니다.
잘못된 셔플은 실제로 얼마나 치우칠까
"무작위로 섞었으니 공평하겠지"라는 직관은 자주 틀립니다. 카드 세 장(A·B·C)을 sort()에 무작위 비교 함수를 넘겨 섞는 방식으로 100만 번 시뮬레이션하면, 여섯 가지 순열이 각각 16.7%씩 나오지 않습니다. 브라우저의 정렬 구현에 따라 특정 순열이 20% 이상 나오고 다른 순열은 12%대로 떨어집니다.
| 순열 | 이상적 확률 | 편향된 정렬 | Fisher-Yates |
|---|---|---|---|
| A B C | 16.67% | 20.8% | 16.7% |
| A C B | 16.67% | 12.5% | 16.6% |
| B A C | 16.67% | 20.9% | 16.7% |
| B C A | 16.67% | 12.4% | 16.7% |
| C A B | 16.67% | 16.6% | 16.6% |
| C B A | 16.67% | 16.8% | 16.7% |
※ 편향된 정렬 수치는 V8 엔진의 정렬 구현에서 관측되는 대표적인 분포이며, 브라우저와 배열 크기에 따라 달라집니다. 요점은 "값이 얼마냐"가 아니라 "균등하지 않다"는 사실입니다.
세 장짜리 예시에서 8%포인트 차이는 사소해 보일 수 있습니다. 그러나 80장짜리 쿠지 한 세트에서 A상 두 장의 위치가 이만큼 치우친다면, 먼저 뽑는 사람과 나중에 뽑는 사람의 기대값이 눈에 띄게 달라집니다. 추첨은 한 번의 결과로 끝나기 때문에, 통계적으로 미세한 편향도 당사자에게는 전부입니다.
2. 클라이언트 사이드 프로세싱의 투명성
기존의 많은 웹 기반 추첨 서비스들이 결과를 중앙 서버에서 비공개로 결정하여 유저에게 전송해 주는 블랙박스 방식을 채택합니다. 그러나 이 방식은 서버 소유자의 결과 조작 시비나 데이터 가로채기(Intercepting) 공격으로부터 자유롭지 못합니다.
반면 오렌지 쿠지는 모든 핵심 추첨 알고리즘과 난수 생성이 사용자의 브라우저 내(Client-side)에서 직접 100% 독립적으로 연산 및 동작합니다.
- 데이터 임의 조작 방지: 통신 딜레이나 패킷 가로채기를 통한 중간 변조 위험이 전혀 없습니다.
- 투명한 검증성: 개발자 도구(F12)의 콘솔 및 스크립트 소스를 열어 실행 중인 스크립트를 투명하게 검증할 수 있습니다.
- 즉각적인 반응성: 인터넷 속도나 네트워크 상황에 구애받지 않고 오프라인 상태에서도 동일한 반응성과 결과를 보여줍니다.
3. 난수 생성기(PRNG)와 유사 난수 분석
대부분의 자바스크립트 환경은 `Math.random()` 함수를 기반으로 동작하며, 최신 브라우저(V8, WebKit 등)는 이를 구현하기 위해 **xorshift128+** 또는 **xoshiro256** 알고리즘을 활용합니다. 이들은 매우 길고 무작위성이 뛰어난 주기(Period)를 제공하여 일상적인 이벤트 추첨 및 게임 환경에서 오차 범위 0.00001% 이하의 완벽히 균등한 통계 분포를 만들어 냅니다.
오렌지 쿠지는 추후 암호학적으로 안전한 의사 난수 생성기(CSPRNG - `crypto.getRandomValues`) 옵션을 추가 도입하여, 단 1비트의 예측 가능성조차 배제하는 차세대 공정성 시스템으로의 업그레이드를 계획하고 있습니다.
4. 1/N 배분 모드에서의 정교한 지분 비례 로직
동호회나 커뮤니티의 여러 참여자가 돈을 나누어 한 세트를 '통털이'하여 구매하는 1/N 펀딩 추첨 모드의 경우, 참여자 각자의 지분(투자금)에 정비례하는 공평한 상품 분배가 이루어져야 합니다.
오렌지 쿠지는 소수점 단위의 지분 배분 오차를 극소화하기 위해 지분율 비례 수학적 나눗셈 계산 후, 남은 소수점 잔여 지분을 누적하여 잔여 가치가 가장 높은 참여자 순으로 우선 배분하는 **해밀턴 방식(Hamilton Method)**의 변형 알고리즘을 사용합니다. 이를 통해 사소한 단수의 굿즈 한 장조차도 누구의 이익으로 편향되지 않고 공정하게 수여되도록 중재합니다.
5. 시각적 공정성을 위한 실시간 현황판 연동
수학적인 확률 연산이 완벽할지라도 유저가 체감하는 정보의 비대칭이 있다면 공정하다고 느낄 수 없습니다. 오렌지 쿠지는 등급별 남은 티켓 수량과 전체 소진율을 실시간 바 그래프 및 비율 카운터를 통해 실시간으로 갱신 및 노출합니다. 사용자는 자기가 뽑는 이 순간의 정확한 조건부 확률을 완전히 시각적으로 이해한 상황에서 게임을 진행할 수 있어 절대적으로 공평하고 안심할 수 있는 이용 경험을 가집니다.
6. 뽑을수록 확률은 어떻게 변하는가 — 실제 계산
제일복권이 룰렛이나 사다리타기와 결정적으로 다른 지점이 여기 있습니다. 룰렛은 몇 번을 돌려도 다음 판의 확률이 그대로지만(복원추출), 쿠지는 뽑은 티켓이 상자에서 사라지기 때문에 남은 사람의 확률이 매번 달라집니다(비복원추출). 이 차이를 모르고 참여하면 "왜 나만 안 나오지"라는 오해가 생깁니다.
전체 80장에 A상이 2장 들어 있는 세트를 예로 들어 보겠습니다. 첫 사람이 A상을 뽑을 확률은 2/80 = 2.5%입니다. 그런데 앞사람들이 A상 없이 20장을 소진했다면, 남은 60장에 A상 2장이 그대로 있으므로 확률은 2/60 ≈ 3.3%로 올라갑니다. 반대로 A상이 이미 한 장 나왔다면 1/60 ≈ 1.7%로 떨어집니다.
| 소진된 티켓 | 남은 티켓 | A상 2장 남음 | A상 1장 남음 |
|---|---|---|---|
| 0 | 80 | 2.50% | 1.25% |
| 20 | 60 | 3.33% | 1.67% |
| 40 | 40 | 5.00% | 2.50% |
| 60 | 20 | 10.00% | 5.00% |
| 75 | 5 | 40.00% | 20.00% |
표가 보여주듯 남은 티켓이 줄어들수록 상위 등급이 남아 있는 한 확률은 계속 올라갑니다. 후반에 뽑는 것이 유리해 보이는 이유가 여기 있습니다. 다만 이는 상위 등급이 아직 남아 있을 때의 이야기고, 이미 소진됐다면 후반 티켓의 가치는 0에 수렴합니다. 그래서 실전에서는 "언제 뽑느냐"보다 "지금 무엇이 남아 있느냐"가 훨씬 중요합니다.
오렌지 쿠지의 실시간 현황판이 등급별 잔여 수량과 갱신된 확률을 항상 노출하는 이유가 이것입니다. 참여자가 자기 차례의 조건부 확률을 정확히 알고 판단할 수 있어야 그 추첨을 공정하다고 느낍니다. 정보를 감추지 않는 것이 알고리즘의 무편향만큼이나 중요한 공정성의 조건입니다.
7. 종이 쿠지와 온라인 추첨, 무엇이 더 공정한가
오프라인 제일복권은 손으로 직접 뽑는다는 점에서 직관적인 신뢰를 줍니다. 그러나 물리적 추첨에는 통제하기 어려운 편향 요인이 여럿 존재합니다.
- 물리적 단서: 상위 등급 티켓이 미세하게 두껍거나, 접힌 자국·인쇄 두께 차이로 촉감이 다른 경우가 보고됩니다.
- 위치 편향: 사람은 상자 가운데나 위쪽에 손이 먼저 갑니다. 상자를 흔들어도 무게 차이가 있으면 분포가 균등해지지 않습니다.
- 순서 기억: 여러 세트를 이어서 진행할 때 앞 세트에서 어느 위치에 무엇이 있었는지가 다음 판단에 영향을 줍니다.
- 검증 불가능성: 결과에 이의가 생겨도 이미 섞인 상자를 되돌려 재현할 방법이 없습니다.
온라인 추첨은 이 요인들을 구조적으로 제거합니다. 티켓에는 두께도 촉감도 없고, 배열은 Fisher-Yates로 균등하게 섞이며, 모든 결과가 시각으로 기록됩니다. 대신 온라인에는 다른 종류의 불신이 있습니다 — "서버가 결과를 조작하지 않았다고 어떻게 믿나".
오렌지 쿠지가 모든 연산을 사용자 브라우저에서 처리하고 서버로 아무것도 보내지 않는 이유가 여기 있습니다. 조작할 서버가 존재하지 않으면 조작 의혹도 성립하지 않습니다. 개발자 도구를 열어 실행 중인 코드를 직접 확인할 수 있고, 네트워크 탭에는 추첨과 관련된 어떤 통신도 잡히지 않습니다. 검증 가능성이야말로 온라인 추첨이 종이 쿠지보다 앞설 수 있는 지점입니다.
자주 묻는 질문
Q. 나중에 뽑으면 정말 유리한가요?
상위 등급이 남아 있다면 유리합니다. 위 표처럼 남은 티켓이 줄면 확률은 올라갑니다. 다만 상위 등급이 이미 나갔다면 후반 티켓의 기대값은 오히려 낮습니다. 순서 자체보다 잔여 구성이 결정적입니다.
Q. 같은 사람이 연속으로 당첨되는 건 조작 아닌가요?
무작위 추첨에서 연속 당첨은 정상적으로 발생합니다. 80장 중 A상 2장을 한 사람이 모두 가져갈 확률도 0이 아닙니다(약 0.03%). 편향이 없다는 것은 "골고루 나온다"가 아니라 "모든 배치가 같은 확률"이라는 뜻입니다.
Q. 새로고침하면 결과가 바뀌나요?
바뀌지 않습니다. 추첨 결과는 확정 즉시 브라우저 로컬 저장소에 기록되며, 새로고침해도 진행 상태가 그대로 복원됩니다. 마음에 들지 않는 결과를 새로고침으로 되돌리는 것은 불가능합니다.
Q. 결과를 증거로 남길 수 있나요?
결과 요약 화면에서 이미지로 저장하거나 CSV로 내보낼 수 있습니다. 참여자별 당첨 내역과 시각이 함께 기록되므로, 이벤트 종료 후 분쟁이 생겨도 근거 자료로 활용할 수 있습니다.