
html 태그와 VBScript 를 이용한 HTA(HTML Application) 프로그램으로 만들었다.
랜덤함수를 이용해서 무작위 숫자를 중복되지 않게 뽑아내고, 작은 숫자부터 정렬해서 지정한 개수만큼 보여주는 프로그램이다.
랜덤함수를 이용해서 숫자를 만들어낼 때 어떤 방식을 사용하느냐에 따라서 번호 조합이 약간씩 달라진다.
일단은, 랜덤함수에 ‘123456789’를 곱한 뒤 소수점을 없애고(랜덤함수는 소수점으로 발생) 그렇게 만들어진 숫자에서 두개를 잘라 가져오도록 처리.
두개를 잘라오지만 ‘0’ 이 포함되어 있는 경우에 한 자리 숫자가 된다.

숫자를 중복이 없이 뽑아내기 위해 반복문과 조건문이 들어가는데, 알고리즘 로직으로만 보면 문제없을 것 같지만 실제로는 중복된 숫자가 나오는 이상한 결과가 발생했다.
조건문을 아주 원시적이고 기초적으로 주어서 중복 숫자가 나오는 것을 해결했다.
여러 번 테스트 해봤는데, 1 에서 45 사이의 숫자가 전반적으로 고르게 출현한다.
해보다 보면, 앞 번호 쪽으로 쏠리기도 하고, 중간 대 번호가 많이 나오기도 하고, 뒤 번호가 많이 나오기도 한다.
랜덤함수에 곱하는 숫자가 항상 일정하기 때문에 발생하는 문제일 수 있어 랜덤함수를 이중으로 처리했다.
모든 것은 랜덤 한 확률이다.
‘번호생성’ 버튼을 계속 누르면 계속 새로운 번호가 만들어지므로, 계속 누르다가 마음에 드는 번호를 선택하면 된다.
프로그램 다운로드: 20121212-(hta)lotto_number_selecter.zip
프로그램에 사용된 ‘QuickSort’ 함수는 아래의 링크에서 가져옴.
(해당 블로거도 다른 곳에서 퍼온 소스라고 함.)
‘퀵소트(QuickSort)’ 함수는 ASP 에서 배열을 정렬하기 위해 사용하는 로직임.
소스-----------------------------
<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=ks_c_5601-1987">
<title>로또 랜덤번호 생성기</title>
</head>
<body>
<select id="sz" name="sz">
<option value="1">1 개 출력</option>
<option value="2">2 개 출력</option>
<option value="3">3 개 출력</option>
<option value="4">4 개 출력</option>
<option value="5" selected>5 개 출력</option>
<option value="6">6 개 출력</option>
<option value="7">7 개 출력</option>
<option value="8">8 개 출력</option>
<option value="9">9 개 출력</option>
<option value="10">10 개 출력</option>
</select>
<input type="button" id="btn1" name="btn1" value="번호생성" onClick="vbs-ript:call viewlottonumber()">
<div id="maindiv" name="maindiv"></div>
<script language="vbscript">
sub viewlottonumber()
ea = sz.value
for r=1 to ea
rsltmsg = rsltmsg & "<hr>" & randomlottoselect
next
rsltmsg = "<span style='font-size:18pt;font-weight:bold'>" & rsltmsg & "</span>"
'==============
maindiv.innerHTML = rsltmsg
end sub
'▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
'랜덤한 6개의 숫자 뽑아오기
function randomlottoselect
s1="" : s2="" : s3="" : s4="" : s5="" : s6=""
do until (s1<>"" and s2<>"" and s3<>"" and s4<>"" and s5<>"" and s6<>"")
'do until 안의 조건문은 중복 숫자 발생
'do until (s1<>s2 and s1<>s3 and s1<>s4 and s1<>s5 and s1<>s6 and s2<>s3 and s2<>s4 and s2<>s5 and s2<>s6 and s3<>s4 and s3<>s5 and s4<>s6 and s5<>s6)
dotmp = false
do until (dotmp=true)
s1 = randomselect()
s2 = randomselect()
s3 = randomselect()
s4 = randomselect()
s5 = randomselect()
s6 = randomselect()
'if s1<>s2 and s1<>s3 and s1<>s4 and s1<>s5 and s1<>s6 and s2<>s3 and s2<>s4 and s2<>s5 and s2<>s6 and s3<>s4 and s3<>s5 and s4<>s6 and s5<>s6 then
'아래처럼 조건문을 바꾼후 중복숫자 발생하지 않음.
if s1<>s2 and s1<>s3 and s1<>s4 and s1<>s5 and s1<>s6 then
if s2<>s1 and s2<>s3 and s2<>s4 and s2<>s5 and s2<>s6 then
if s3<>s1 and s3<>s2 and s3<>s4 and s3<>s5 and s3<>s6 then
if s4<>s1 and s4<>s2 and s4<>s3 and s4<>s5 and s4<>s6 then
if s5<>s1 and s5<>s2 and s5<>s3 and s5<>s4 and s5<>s6 then
if s6<>s1 and s6<>s2 and s6<>s3 and s6<>s4 and s6<>s5 then
dotmp = true
end if
end if
end if
end if
end if
end if
loop
loop
Dim sar(6)
sar(1) = cdbl(s1)
sar(2) = cdbl(s2)
sar(3) = cdbl(s3)
sar(4) = cdbl(s4)
sar(5) = cdbl(s5)
sar(6) = cdbl(s6)
call QuickSort(sar,1,6)
s1 = sar(1)
s2 = sar(2)
s3 = sar(3)
s4 = sar(4)
s5 = sar(5)
s6 = sar(6)
linkstr = " "
rsltmsg = s1 & linkstr & s2 & linkstr & s3 & linkstr & s4 & linkstr & s5 & linkstr & s6
randomlottoselect = rsltmsg
end function
'▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
function rndgob()
Randomize
rndgob = round(rnd*123456789)
end function
'▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
'1~45 숫자중 하나를 선택
Function randomselect()
on error resume next
Randomize '랜덤초기화
code = 0
do until (code>0 and code<=45)
'code = round(rnd*100000) + 3
'code = mid(code,2,2) '간혹 에러 발생, 1단위 숫자가 많이 나옴
'code = left(code,2) '주로 10단위 이상 숫자만 나옴
'code = right(code,2)
'code = left(right(code,4),2) '1단위 숫자가 많이 나옴
'code = round(rnd*123456789)
code = round(rnd*rndgob)
code = mid(code,3,2)
loop
rslt = code
'rslt = cdbl(rslt)
if left(rslt,1)="0" then
rslt = right(rslt,1)
'rslt = cdbl(rslt)
end if
if (rslt=0 or err) then : rslt=randomselect : end if
randomselect = rslt
End Function
'▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
'vec 배열, loBound 최저값, hiBound 최고값
Sub QuickSort(vec,loBound,hiBound)
Dim pivot,loSwap,hiSwap,temp
' QuickSort는 정렬이 안된 배열을 정렬할 때 가장 빠른 방식이다.
' 정렬되어야 할 아이템이 두 개일 경우
if hiBound - loBound = 1 then
if vec(loBound) > vec(hiBound) then
temp=vec(loBound)
vec(loBound) = vec(hiBound)
vec(hiBound) = temp
End If
End If
' 정렬되어야 할 아이템이 세 개 이상일 경우
pivot = vec(int((loBound + hiBound) / 2))
vec(int((loBound + hiBound) / 2)) = vec(loBound)
vec(loBound) = pivot
loSwap = loBound + 1
hiSwap = hiBound
do
' 적절한 loSwap 찾기
while loSwap < hiSwap and vec(loSwap) <= pivot
loSwap = loSwap + 1
wend
' 적절한 hiSwap 찾기
while vec(hiSwap) > pivot
hiSwap = hiSwap - 1
wend
' loSwap이 hiSwap보다 작으면 값 교체
if loSwap < hiSwap then
temp = vec(loSwap)
vec(loSwap) = vec(hiSwap)
vec(hiSwap) = temp
End If
loop while loSwap < hiSwap
vec(loBound) = vec(hiSwap)
vec(hiSwap) = pivot
' QuickSort의 백미 : 재귀 호출(Recursively call function)
'첫 번째 섹션에서 두 개 또는 그 이상의 아이템
if loBound < (hiSwap - 1) then
Call QuickSort(vec,loBound,hiSwap-1)
end if
'두 번째 섹션에서 두 개 또는 그 이상의 아이템
if hiSwap + 1 < hibound then
Call QuickSort(vec,hiSwap+1,hiBound)
end if
End Sub 'QuickSort
'▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
</script>
</body>
</html>
---------------------------------
덧붙이는 이야기.
2011년 3월경에 ‘hta’로 프로그램을 만들면서 이것저것 만들다가 ‘로또번호 분석프로그램’을 만들어 보려고 작업한 적이 있었다.
작업하면서 도중에 그만두게 된 이유는 로또 번호를 분석한다는 것 자체가 효용성이 없다는 결론을 내렸기 때문이다.
갑자기 생각나서 다시 프로그램을 완성해볼까 싶어 작업을 하다가, 쓸데없을 것 같아서 중단하고, 랜덤번호 생성하는 부분만 별도로 프로그램으로 만들었다.
요즘처럼 경제상황이 안 좋은 가운데 ‘미래가 보이지 않는다!’고 느끼는 제법 많은 평범한 소시민들은 ‘인생역전’을 꿈꾸며 ‘로또’라는 탈출구에 매달리기도 하는데, 그에 덩달아 로또 관련 사이트들이 우후죽순 생겨나며 저마다 자신들이 로또 당첨번호를 많이 뽑아냈다고 광고한다.
한술 더 떠서 자신들만의 특별한 분석방식이 있다며 광고하는데…
과연, 로또 번호를 분석해서 확률이 높은 번호를 뽑아내는 게 가능할까?
그렇다면, 과연 어떤 방식의 분석이 가능할까?
이런 의문을 계속 되뇌며, 로또의 추첨 원리와 분석방법에 대해 고민을 해보았다.
로또는 발매 초창기에 광풍이 일 정도로 대중들의 큰 관심을 받았다.
누가 1등을 했네, 1등을 해서 회사 그만두고 잠적을 했네, 1등해서 이혼하고, 복권을 공동구매한 사람들끼리 싸우다가 법정까지 갔네 어쩌네 하며 간혹 뉴스가 나와도, 정작 그런 사람들이 주변에 없으니 알 길이 없고, 그저 무용담 같이 들릴 뿐이다.
어떤 사람들은 은퇴자금을 로또에 올인 했다가 재산을 탕진하기도 하고, 어떤 사람들은 ‘나름 취미생활’ 이라며, 한번 구매할 때마다 복권방 여러 군데를 돌며 수십만 원씩 로또를 사는 사람도 있다고 한다.
저 나름의 분석방식을 가지고 나름 철저히 준비해서 숫자를 기재하거나, 꿈에 조상님이 나타났다거나 하는 등등, 그럴만한 이유와 행복한 예감에 구입을 하지만, 과연 얼마나 당첨 확률이 높을까?
로또는 안이 투명하게 보이는 기계에 숫자가 적힌 동그란 공을 넣고 돌리다가 당첨번호가 빨려 올라가 나온다.
일각에서는 공의 무게를 달리해서 인위적으로 조작이 가능하다는 얘기도 있지만, 사업단 측에서는 절대 조작이 없으며 다른 나라에서도 사용하는 공인된 기계를 사용하고 있고, 자신들도 논란을 없애기 위해 많은 준비를 한다고 말한다.
하지만, 알 수 없는 얘기다.
겉으로 보기에는 전혀 문제가 없고 공정해 보여도, 당연히 조작이 가능하다.
지금까지 당첨된 번호를 분석해서 많이 출현하는 번호 및 당첨 번호와 인접한 번호 등을 분석한 뒤 당첨확률이 높은 번호를 뽑아낼 수 있을까?
이건, 꽤 그럴듯하지만 상당히 아이러니한 말이다.
애초에 랜덤으로 뽑아지게 만든 기계인데, 많이 출현하는 번호가 또 나올 가능성이 있을 리가 없고, 인접한 번호를 묶음으로 묶는 분석방식 또한 논리적으로 따져보면 그다지 신빙성이 없다.
물론, 기계가 어떤 특성을 가지고 있어서 특정 번호가 많이 나올 가능성이 없는 것은 아니다.
지속적으로 같은 공을 추첨에 사용하다보면 공에 변형이 발생할 수 있다.
매 추첨마다 그램을 재서 균일하게 맞추고 공의 겉면이 동일하게 원형을 유지하고 있다면 정말 똑같은 확률을 가질지도 모르지만, 이 세상에 있는 물질은 저마다 조금씩 다르게 변형이 발생한다.
어떤 공이 미세하게나마 다른 공보다 가볍다거나 무거워서 그 공이 많이 뽑혀 나올 가능성도 있다.
이미 위에서 언급했듯이, 그런 과학적 분석과 테스트를 미리 해보고 악의적으로 조작하기 전에는 애초에 어떤 공의 무게가 변하고 겉면에 변형이 생겨서 잘 뽑아져 나올지 알 방법은 없다.
결국, 지금까지 나온 번호를 기준으로 분석한다는 것은 그다지 효용성이 없는 일이고, 만약 어떤 기계와 어떤 공들의 특성이 간접적으로나마 출현한 번호들을 바탕으로 분석되어졌다 하더라도, 복권사업단에서 기계를 바꾸고 공을 새것으로 교체하면 상황이 다시 원점으로 돌아갈 뿐이다.
좀 다른 분야이기는 하지만, 주식투자의 경우에도 후시(사건이 발생한 이후)적 차트 분석을 통해 미래에 해당 종목이 어떻게 움직일 것인지에 대한 다양한 분석 자료를 내놓고 있다.
그러한 분석이 정말 효과가 있다면, 대다수 사람들은 돈을 벌어야 하지만, 현실은 그렇지 않다는 것을 모두들 잘 알고 있다.
물론, 주식의 경우에는 거시(큰 틀에서 보는)적 관점에서 볼 때 완벽하지는 않아도 대략적인 패턴이 있을 수는 있다.
큰돈을 굴리는 기관이나 단체는 그런 거시적 관점에서 분석하며 긴 시간을 투자하지만, 일반 소액 투자자들은 그렇지 않다.
결론은, 분석 자체가 큰 의미가 없다는 것이다.
이 프로그램은 확률 높은 로또 번호를 만드는 것 보다는, 1부터 45까지의 숫자 중에 중복되지 않는 숫자 6개를 무작위로 생성해서, 되도록 분포가 골고루 되어있는 묶음을 뽑아오는 과정을 실제 알고리즘으로 구현해보는데 의미가 있다.
참고할 뉴스:
20120721-로또 1등 당첨번호 조작설, 파헤쳐보니 `경악`
덧글