로또 6/45 추첨은 매주 토요일 오후 8시 35분경 MBC 생방송으로 진행됩니다. 투명한 구체 안에서 45개의 공이 바람에 날리다가, 하나씩 관을 타고 올라와 차례로 모습을 드러냅니다. 이 사이트의 첫 화면에 있는 추첨기는 그 장면을 브라우저 안에서 물리 계산으로 재현한 것입니다. 이 글에서는 공기로 공을 섞는 방식이 왜 추첨에 적합한지, 그리고 이 사이트가 그 움직임을 어떻게 흉내 냈는지를 설명합니다.
공기로 섞는 이유
공기 혼합식 추첨기는 아래쪽에서 강한 바람을 불어 넣어 공들을 띄웁니다. 떠오른 공들은 서로, 그리고 구체의 벽과 쉴 새 없이 부딪힙니다. 부딪힐 때마다 공의 방향과 속도가 조금씩 바뀌는데, 이 변화가 쌓이는 방식이 추첨의 핵심입니다.
두 공이 비스듬히 부딪히면 부딪힌 각도가 아주 조금만 달라도 튕겨 나가는 방향이 꽤 달라집니다. 그 공이 다음에 부딪히는 공도 달라지고, 차이는 충돌을 거듭할수록 눈덩이처럼 커집니다. 물리학에서는 이런 성질을 초기 조건에 대한 민감성이라고 부릅니다. 결과적으로 바람을 켜고 몇 초만 지나면 처음 공이 어떻게 놓여 있었는지로 어느 공이 먼저 뽑힐지 예측하는 것이 사실상 불가능해집니다. 사람의 손이 공을 고르지 않으면서도 결과를 미리 알 수 없게 만드는 것, 이것이 공기 혼합 방식의 목적입니다.
공이 뽑히는 순간에도 같은 원리가 작동합니다. 추첨기 위쪽의 입구 근처를 그 순간 지나가던 공이 관 안으로 들어가는데, 어느 공이 그 자리에 있을지는 바로 전까지의 수많은 충돌이 정합니다. 뽑힌 공은 다시 들어가지 않으므로, 6개가 모두 서로 다른 번호가 됩니다.
공개로 진행되는 추첨
추첨 과정은 생방송으로 공개되고, 동행복권 홈페이지에서는 추첨 방송 참관 신청도 받습니다. 추첨 결과는 방송이 끝난 뒤 동행복권 홈페이지·모바일 앱·고객센터(1588-6450)로 확인할 수 있습니다. 이 사이트는 그렇게 발표된 결과를 매주 가져와 당첨번호와 통계 페이지에 반영합니다.
이 사이트의 추첨기는 어떻게 만들었나
첫 화면의 추첨기는 HTML 캔버스 위에서 돌아가는 2차원 물리 시뮬레이션입니다. 외부 게임 엔진이나 물리 라이브러리 없이 직접 작성했고, 구성은 다음과 같습니다.
1. 일정한 간격으로 계산하는 시간
시뮬레이션은 화면이 그려지는 속도와 관계없이 1/240초라는 고정된 간격으로 한 걸음씩 계산합니다. 초당 60번 그리는 화면이라면 한 번 그릴 때마다 물리 계산이 4번 실행됩니다. 간격을 고정하는 이유는 두 가지입니다. 기기의 성능이나 화면 주사율이 달라도 공의 움직임이 같은 규칙을 따르고, 간격이 짧아야 빠르게 움직이는 공끼리 서로 통과해 버리는 오류가 줄어듭니다.
2. 공에 작용하는 힘
- 중력: 모든 공을 아래로 당깁니다(초당 초당 1,800픽셀).
- 송풍기의 상승 기류: 구체 아래쪽 가운데에서 가장 강하고, 가장자리로 갈수록 약해지는 위쪽 힘입니다. 바람을 켜면 이 힘이 서서히 세지고, 끄면 서서히 약해집니다.
- 난류: 매 계산마다 무작위 방향으로 공을 조금씩 흔드는 힘입니다. 실제 기류의 불규칙한 소용돌이를 단순하게 흉내 낸 것입니다.
- 회전 흐름: 구체 안을 빙 도는 공기 흐름입니다. 공들이 구체 벽을 따라 돌며 위쪽 입구 근처를 지나가게 만듭니다.
- 공기 저항과 속도 상한: 속도를 조금씩 줄이고, 너무 빨라지지 않게 최고 속도를 제한합니다.
3. 충돌
매 계산마다 모든 공 쌍의 거리를 확인해 겹친 공을 서로 밀어내고, 부딪히는 방향으로 속도를 주고받게 합니다. 공끼리의 충돌은 탄성이 꽤 높게(반발 계수 0.78), 구체 벽과의 충돌은 그보다 조금 덜 튀게(0.6) 설정했습니다. 바람이 꺼져 공들이 바닥에 쌓일 때는 반발을 거의 없애고 계산을 여러 번 반복해, 공 더미가 흔들리지 않고 안정적으로 멈추도록 했습니다. 충돌이 강할 때 나는 "딸깍" 소리도 이 계산에서 나옵니다.
4. 공을 뽑는 방식
추첨 차례가 되면 구체 맨 위 입구 근처를 위쪽으로 움직이며 지나가는 공이 포획관으로 빨려 들어갑니다. 실제 방송처럼 공이 저절로 입구에 들어가기를 기다리는 방식입니다.
다만 화면 속 추첨이 끝없이 늘어지지 않도록 보정 장치를 하나 넣었습니다. 차례가 된 뒤 2.2초가 지나도(빠른 추첨에서는 0.9초) 공이 들어오지 않으면, 그 순간 구체 위쪽 절반에서 입구에 가장 가까운 공을 입구 쪽으로 끌어올립니다. 실제 기계의 흡입 장치 역할을 단순화한 것입니다. 어느 공이 입구에 가장 가까울지는 그 순간까지의 움직임에 달려 있어 미리 알 수 없습니다.
5. 포획관에서 트레이까지
뽑힌 공이 지나가는 길은 직선 4개와 곡선 3개로 이어져 있습니다. 포획관을 따라 곧게 올라가서 위쪽 곡관을 돌고, 오른쪽 낙하관으로 내려와 아래 트레이로 굴러갑니다. 올라갈 때는 일정하게 가속하고, 내려올 때는 경사에 따라 중력과 마찰을 받으며 굴러갑니다. 트레이 끝이나 앞 공에 닿으면 살짝 튕겼다가 멈춥니다. 공이 굴러가는 거리만큼 공 표면의 숫자도 돌아가고, 멈춘 뒤에는 숫자가 정면을 보도록 천천히 돌아옵니다.
6. 그리기와 소리
배경 조명, 유리 구체, 관처럼 움직이지 않는 부분은 처음에 한 번만 별도의 캔버스에 그려 두고, 매 화면마다 공만 다시 그립니다. 덕분에 휴대폰에서도 부드럽게 돌아갑니다. 송풍기 소리와 공 부딪히는 소리는 녹음 파일 없이 브라우저의 Web Audio 기능으로 즉석에서 만듭니다. 송풍기 소리는 무작위 잡음에서 높은 소리를 걸러 낸 것이고, 충돌음은 아주 짧은 잡음입니다.
무작위성은 어디서 오나
이 시뮬레이션의 결과는 물리 계산을 거쳐 정해지지만, 출발점에는 브라우저의 난수가 있습니다. 공 45개의 처음 배치를 섞을 때와 매 순간의 난류 힘에 난수를 씁니다. 그 뒤의 충돌 과정이 작은 차이를 크게 키우기 때문에, 같은 버튼을 눌러도 매번 다른 번호가 나옵니다.
솔직하게 덧붙이면, 이 추첨기는 연출을 위한 시뮬레이션입니다. 45개 번호가 정확히 같은 확률로 뽑힌다는 것을 수학적으로 보장하도록 설계하지는 않았습니다. 번호를 공정하게 무작위로 고르는 것이 목적이라면 번호 확인 페이지의 "무작위로 채우기"처럼 암호학적 난수로 직접 뽑는 방법이 더 단순하고 정확합니다. 어느 쪽이든 그렇게 뽑은 번호가 실제 추첨에서 더 잘 맞는 일은 없습니다.
실제 추첨기와 다른 점
- 2차원입니다. 실제 공은 3차원 공간을 날아다니며 앞뒤로도 부딪히지만, 이 시뮬레이션은 평면 위에서만 움직입니다.
- 기류를 단순화했습니다. 실제 공기의 흐름을 계산하지 않고, 상승 기류·난류·회전 흐름이라는 세 가지 힘으로 비슷한 움직임을 만들었습니다.
- 공의 재질과 무게를 따로 다루지 않습니다. 모든 공은 같은 크기와 무게의 완전한 원입니다.
- 실제 추첨과 아무 관계가 없습니다. 이 추첨기에서 나온 번호는 실제 당첨번호를 예측하지 않으며, 실제 추첨에 영향을 주지도 않습니다.
직접 돌려 보기
첫 화면에서 번호 뽑기를 누르면 송풍기가 켜지고, 3초쯤 공을 섞은 뒤 한 개씩 뽑기 시작합니다. 빠른 추첨을 켜면 간격이 짧아지고, 기기에서 동작 줄이기 설정을 켜 두었다면 처음부터 빠른 추첨으로 시작합니다. 뽑힌 공 옆에는 그 번호가 실제 당첨번호로 마지막에 나온 시점과 최근 1년 출현 횟수가 표시됩니다. 이 기록을 어떻게 읽어야 하는지는 자주 나온 번호를 고르면 유리할까?에 정리했습니다.