[prompt] VBA 함수를 만들어줘.
- 1에서 45까지 범위 내에서 6개의 숫자를 무작위로 선택해
- 선택된 6개의 숫자를 sheet1의 A2자리부터 오른쪽으로 내림차순으로 입력해
- A2부터 F2까지 입력된 값에서 A2 빼기 F2, A2 빼기 B2, B2 빼기 C2, C2 빼기 D2, D2 빼기 E2, E2 빼기 F2를 해서 각각의 값을 G2부터 오른쪽으로 입력해
- 이를 100번 반복하면서, 반복할 때 마다 아래쪽으로 입력해
아래는 주어진 조건을 충족하는 VBA 코드를 작성한 것입니다. 이 코드는 1부터 45까지의 범위 내에서 6개의 숫자를 무작위로 선택하고, 내림차순으로 정렬한 후, 차이를 계산하여 결과를 Sheet1에 100번 반복하여 입력합니다.
Dim nums(1 To 6) As Integer
Dim i As Integer, j As Integer, k As Integer
Dim temp As Integer
Dim differences(1 To 6) As Integer
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Sheet1")
' '최장선값' 헤더 추가
ws.Range("A1:F1").Value = Array("Num1", "Num2", "Num3", "Num4", "Num5", "Num6")
ws.Range("G1:L1").Value = Array("A2-F2", "A2-B2", "B2-C2", "C2-D2", "D2-E2", "E2-F2")
For k = 1 To 100
' 1부터 45까지의 6개의 랜덤 숫자 생성 (중복 없이)
Randomize
i = 1
Do While i <= 6
temp = Int((45 - 1 + 1) * Rnd + 1)
If Not IsInArray(temp, nums) Then
nums(i) = temp
i = i + 1
End If
Loop
' 내림차순 정렬
For i = 1 To 5
For j = i + 1 To 6
If nums(i) < nums(j) Then
temp = nums(i)
nums(i) = nums(j)
nums(j) = temp
End If
Next j
Next i
' 숫자 입력
For i = 1 To 6
ws.Cells(k + 1, i).Value = nums(i)
Next i
' 차이 값 계산 및 입력
differences(1) = nums(1) - nums(6)
differences(2) = nums(1) - nums(2)
differences(3) = nums(2) - nums(3)
differences(4) = nums(3) - nums(4)
differences(5) = nums(4) - nums(5)
differences(6) = nums(5) - nums(6)
For i = 1 To 6
ws.Cells(k + 1, i + 6).Value = differences(i)
Next i
Next k
End Sub
Function IsInArray(val As Integer, arr As Variant) As Boolean
Dim i As Integer
IsInArray = False
For i = LBound(arr) To UBound(arr)
If arr(i) = val Then
IsInArray = True
Exit Function
End If
Next i
End Function
위 코드를 실행하려면 다음 단계를 따르세요:
- Alt + F11 키를 눌러 VBA 편집기를 엽니다.
- 삽입 메뉴에서 모듈을 선택하여 새 모듈을 추가합니다.
- 위의 코드를 복사하여 붙여넣습니다.
- F5 키를 눌러 코드를 실행합니다.
이 코드는 "Sheet1"에 1부터 45까지의 숫자 중에서 6개의 숫자를 무작위로 선택하여 내림차순으로 정렬한 후, 해당 숫자를 A2부터 F2까지 입력하고, A2와 F2, A2와 B2, B2와 C2 등의 차이를 G2부터 L2까지 입력합니다. 이 과정을 100번 반복하여 각각의 결과를 아래쪽으로 입력합니다. G1부터 L1까지는 각 차이의 설명을 포함합니다.
[prompt] 다음 숫자 5개에 대한 패턴을 분석해줘
패턴 분석을 위해 다음 단계로 데이터를 분석해보겠습니다. 이 과정에서는 주어진 숫자 데이터에 대해 몇 가지 기본 통계량(평균, 중앙값, 최빈값, 표준편차)을 계산하고, 각 열 간의 상관 관계를 분석하여 패턴을 식별할 수 있습니다.
우선, Excel 함수와 VBA 코드를 사용하여 이 데이터를 분석하는 방법을 설명하겠습니다.
1. 기초 통계량 계산 (Excel 함수)
각 열의 평균, 중앙값, 최빈값, 표준편차를 계산하는 함수는 다음과 같습니다:
- 평균 (Average): =AVERAGE(A2:A39)
- 중앙값 (Median): =MEDIAN(A2:A39)
- 최빈값 (Mode): =MODE.SNGL(A2:A39)
- 표준편차 (Standard Deviation): =STDEV.S(A2:A39)
이를 B, C, D, E, F열에 대해서도 동일하게 적용합니다.
2. 상관 관계 분석 (Excel 함수)
각 열 간의 상관 관계를 계산하는 함수는 다음과 같습니다:
- 상관 관계 (Correlation): =CORREL(A2:A39, B2:B39)
이를 다른 열 조합에 대해서도 동일하게 적용합니다.
3. VBA를 사용한 분석 자동화
다음 VBA 코드를 사용하여 데이터를 자동으로 분석할 수 있습니다.
[prompt] 1부터 35까지 숫자를 가지고 만들 수 있는 가장 높게 출현할 5개 조합의 수는
1부터 35까지 숫자 중 5개를 조합하여 가장 높은 출현 확률을 가지는 조합을 찾는 것은, 수학적으로 모든 가능한 조합의 수를 먼저 계산한 후 특정 조합의 출현 확률을 평가하는 것입니다.
1. 가능한 조합의 수
1부터 35까지 숫자 중 5개를 선택하는 조합의 수는 조합 수식을 통해 계산할 수 있습니다. 조합 수식은 다음과 같습니다:
(nk)=n!k!(n−k)!\binom{n}{k} = \frac{n!}{k!(n-k)!}
여기서 nn은 총 숫자의 개수 (35)이고, kk는 선택할 숫자의 개수 (5)입니다.
이를 계산하면:
(355)=35!5!(35−5)!\binom{35}{5} = \frac{35!}{5!(35-5)!}
이를 Python으로 계산해보겠습니다.
2. 파이썬 코드
n = 35
k = 5
number_of_combinations = math.comb(n, k)
number_of_combinations
이를 실행하면 다음과 같은 결과를 얻을 수 있습니다.
3. 특정 조합의 출현 확률
특정 조합의 출현 확률은 복권 추첨과 같은 무작위 사건에서 모든 조합이 동일한 확률로 출현한다고 가정하면, 각각의 조합이 출현할 확률은 1/number_of_combinations입니다.
이를 Excel로 구현하기 위해서는, Excel의 VBA 코드를 사용하여 1부터 35까지의 숫자 중 5개를 선택하는 조합의 수를 계산하고, 특정 조합의 출현 확률을 계산할 수 있습니다.
VBA 코드
다음 VBA 코드를 사용하여 조합의 수를 계산하고, 특정 조합의 출현 확률을 구할 수 있습니다.
Dim n As Long
Dim k As Long
Dim numCombinations As Double
Dim specificCombinationProb As Double
n = 35
k = 5
numCombinations = Application.WorksheetFunction.Combin(n, k)
specificCombinationProb = 1 / numCombinations
' 결과 출력
Range("A1").Value = "Total Combinations"
Range("A2").Value = numCombinations
Range("B1").Value = "Probability of Specific Combination"
Range("B2").Value = specificCombinationProb
End Sub
실행 방법
- Excel에서 Alt + F11 키를 눌러 VBA 편집기를 엽니다.
- 삽입 메뉴에서 모듈을 선택하여 새 모듈을 추가합니다.
- 위의 코드를 복사하여 붙여넣습니다.
- VBA 편집기에서 F5 키를 눌러 코드를 실행합니다.
이 코드를 실행하면 Excel의 셀 A1에 가능한 총 조합의 수를, B1에 특정 조합의 출현 확률을 표시합니다.
이 계산의 결과로는:
- 총 가능한 조합의 수: 324,632
- 특정 조합의 출현 확률: 약 3.08e-06 (즉, 1/324,632)
이 조합의 출현 확률은 매우 낮지만, 이는 모든 조합이 동일한 확률을 가지는 경우입니다. 데이터에 기반한 패턴 분석은 추가적인 통계적 분석을 통해 이루어져야 합니다.
[prompt] 여기에 1을 반드시 포함하는 총 가능한 조합의 수는
1부터 35까지의 숫자 중 5개를 선택할 때, 반드시 1을 포함하는 조합의 수를 계산하려면, 1을 포함한 나머지 4개의 숫자를 2부터 35까지의 숫자 중에서 선택하는 경우의 수를 계산하면 됩니다.
1을 포함하는 경우 나머지 4개의 숫자는 34개의 숫자 중에서 선택하게 됩니다.
조합 계산
조합 수식은 다음과 같습니다:
(nk)=n!k!(n−k)!\binom{n}{k} = \frac{n!}{k!(n-k)!}
여기서 nn은 총 숫자의 개수 (34)이고, kk는 선택할 숫자의 개수 (4)입니다.
이를 Python으로 계산해보겠습니다.
n = 34
k = 4
number_of_combinations = math.comb(n, k)
number_of_combinations
이를 실행하면 다음과 같은 결과를 얻을 수 있습니다.
이 계산을 통해 결과를 얻을 수 있으며, 이를 Excel의 VBA 코드로도 구현할 수 있습니다.
VBA 코드
다음 VBA 코드를 사용하여 1을 반드시 포함하는 경우의 총 가능한 조합의 수를 계산할 수 있습니다.
Dim n As Long
Dim k As Long
Dim numCombinations As Double
n = 34 ' 2부터 35까지 34개의 숫자
k = 4 ' 나머지 4개의 숫자 선택
numCombinations = Application.WorksheetFunction.Combin(n, k)
' 결과 출력
Range("A1").Value = "Total Combinations Including 1"
Range("A2").Value = numCombinations
End Sub
실행 방법
- Excel에서 Alt + F11 키를 눌러 VBA 편집기를 엽니다.
- 삽입 메뉴에서 모듈을 선택하여 새 모듈을 추가합니다.
- 위의 코드를 복사하여 붙여넣습니다.
- VBA 편집기에서 F5 키를 눌러 코드를 실행합니다.
이 코드를 실행하면 Excel의 셀 A1에 1을 반드시 포함하는 총 가능한 조합의 수를 표시합니다.
이를 Python으로 계산한 결과를 보면 다음과 같습니다:
n = 34
k = 4
number_of_combinations = math.comb(n, k)
number_of_combinations
이 코드를 실행하면 1을 반드시 포함하는 5개의 숫자 조합의 총 수는 46,376개입니다.
[prompt] sheet1에서 A1부터 E1000까지 각 행 마다 5개의 숫자로 구성되어 있다. 각 행을 정렬된 튜플로 변환한 다음, 패턴 개수를 세는 VBA 함수는
VBA를 사용하여 주어진 범위의 데이터를 정렬된 튜플로 변환하고 패턴의 개수를 세는 방법을 설명하겠습니다. 이 작업을 수행하는 함수는 다음과 같습니다:
- 각 행의 데이터를 정렬된 튜플로 변환합니다.
- 튜플을 Dictionary 객체에 저장하고, 각 튜플의 빈도를 카운트합니다.
아래는 VBA 코드를 포함한 함수입니다:
Dim ws As Worksheet
Dim dataRange As Range
Dim cell As Range
Dim row As Range
Dim dict As Object
Dim key As Variant
Dim values() As Long
Dim i As Long, j As Long
' Dictionary 객체 생성
Set dict = CreateObject("Scripting.Dictionary")
' Sheet1 설정
Set ws = ThisWorkbook.Sheets("Sheet1")
' A1:E1000 범위 설정
Set dataRange = ws.Range("A1:E1000")
' 각 행을 순회
For Each row In dataRange.Rows
' 행 데이터 배열로 변환
ReDim values(1 To 5)
i = 1
For Each cell In row.Cells
values(i) = cell.Value
i = i + 1
Next cell
' 배열 정렬
Call BubbleSort(values)
' 정렬된 배열을 튜플로 변환
Dim tuple As String
tuple = "(" & values(1) & ", " & values(2) & ", " & values(3) & ", " & values(4) & ", " & values(5) & ")"
' Dictionary에 튜플을 키로 저장하고 카운트 증가
If dict.exists(tuple) Then
dict(tuple) = dict(tuple) + 1
Else
dict.Add tuple, 1
End If
Next row
' 결과 출력
i = 1
For Each key In dict.Keys
ws.Cells(i, 7).Value = key
ws.Cells(i, 8).Value = dict(key)
i = i + 1
Next key
' Dictionary 객체 해제
Set dict = Nothing
End Sub
Sub BubbleSort(arr() As Long)
Dim i As Long, j As Long
Dim temp As Long
Dim swapped As Boolean
For i = LBound(arr) To UBound(arr) - 1
swapped = False
For j = LBound(arr) To UBound(arr) - 1 - i
If arr(j) > arr(j + 1) Then
temp = arr(j)
arr(j) = arr(j + 1)
arr(j + 1) = temp
swapped = True
End If
Next j
If Not swapped Then Exit For
Next i
End Sub
위 코드의 주요 부분을 설명하겠습니다:
- CountPatterns 서브루틴:
- Sheet1에서 A1:E1000 범위를 선택합니다.
- 각 행의 데이터를 배열로 변환한 후, BubbleSort 함수를 사용하여 정렬합니다.
- 정렬된 배열을 문자열 형태의 튜플로 변환하여 Dictionary에 저장하고 빈도를 증가시킵니다.
- 최종 결과를 시트의 열 G와 H에 출력합니다.
- BubbleSort 서브루틴:
- 간단한 버블 정렬 알고리즘을 사용하여 배열을 정렬합니다.
이 코드는 Excel VBA 모듈에 추가하여 실행할 수 있습니다. 결과는 튜플과 해당 빈도가 Sheet1의 G열과 H열에 표시됩니다.
6/45 : 45개 중 6개를 선택한다. 모수가 너무 많아 줄여야겠다. 중복 불가능
5/35 : 35개 중 5개를 선택한다. 중복 가능 <변의 값으로 전환>
그에 따른 1차 결과다. 10000개 중 5개의 변을 선택하는 가장 높은 출현 확률은 최대값 13이었다.
다음에는, 계속 반복하면서 가장 높게 출현하는 조합을 찾아볼 예정이다.
추가로, 이와관련 유튜브, 블로그, GPT로 만들어볼 계획이다.
2024.6.5.
10000개 경우의 수를 다시 실행했다. ChatGPT에서 코드 복사를 해서.
결과, 5변의 경우 최대값 13을 정점으로 정규분포를 나타내다가 최대값 12와 정점을 오갔다. 최대값 13 또는 12의 출현이 9%대, 최대값 11 또는 14, 15의 출현이 8%대를 나타냈다.
최소값은 1의 출현이 50%대를 나타냈고, 최소값 2는 20%대, 최소값 3은 10%대를 나타냈다.
5변의 평균의 평균은 6.5, 중앙값의 평균은 5.2, 표준편차의 평균은 5.2, 합계의 평균은 32 정도를 나타냈다. 이는 10000번을 반복 수행해도 동일한 값으로 출현했으니 그 의미에 대해 활용 범위를 찾아보자. 더구나, 중앙값과 표준편차의 평균이 비슷하게 나타냈다는 의미에 대해서 활용 범위를 찾아보자. (수학자의 의견을 청한다)
참고로, 6개의 숫자 간의 차이가 가장 큰 변과 차선 변의 상관관계가 0.65로 양의 상관관계를 나타냈다는 점이다.
본 결과를 토대로 5변 조합을 최적화한다.
5변 최대값 13(출현율 약 9% 중반) + 최소값 1(출현율 50% 중반) = 약 4% ??
결국, 10000번 중 최대값 13과 최소값 1을 갖고 출현한 경우의 수를 찾는다.
그리고, 10000번 중 3번 이상 출현한 조합의 수를 선택한다. 약 20개.
[prompt] 시트 '최대값13'에서 A1부터 E1000까지 각 행 마다 5개의 숫자로 구성되어 있다. 각 행을 정렬된 튜플로 변환한 다음, 패턴 개수를 세는 VBA 함수는
이를 실행에 옮기려면,
(1) 시작점 숫자 36~45 = 10개
(2) 최적화된 조합(최대값 13과 최소값 1이 10000번 중 3번 이상 출현)의 경우 수 = 20개
: 10 경우의 숫자 x 20 경우의 조합 x 1000원/건 = 200,000원/회
:: 매주 응모하기에 부담 없는 금액 1000원/회 이면 200명 회원이 필요하고, 10000원/회 이면 20명 회원이 필요
::: 최적화된 조합을 최대값 12와 14로 확장하는 경우, 10000번 중 3번 이상 출현한 조합의 수를 각 20개 선정하면 x3 (600,000원/회)
:::: 결과적으로, 회원제 운영. 당첨 시 1/n 신뢰성 확보, 커뮤니티 공간이 필요
* 5변으로 구성된 방사형 패턴에서 최적의 형태를 찾을 수는 없는 것일까 탐구 계속
'현금흐름 > Lotto의 실마리, 2011.8.~' 카테고리의 다른 글
Random Numbers VBA, Find the optimal combination VBA (0) | 2024.06.10 |
---|---|
Find the optimal combination 6/45 (0) | 2024.06.04 |
번호 (0) | 2021.03.09 |
2021.1.14. Selection (0) | 2021.01.14 |
(Total Summary) What I've found so far (0) | 2021.01.14 |
댓글