MW211 EXIT

devlog
ExcelVBA/正規表現のモンテカルロ法による検証
2017年12月01日
┌──────────────────────────────────────┐
│Option Explicit                                                             │
├──────────────────────────────────────┤
│Public Sub 正規表現のモンテカルロ法による検証()                             │
│    Dim REG As Object: Set REG = CreateObject("VBScript.RegExp")            │
│    Dim i As Long, 検証文字 As String                                       │
│    Dim y1 As Long: y1 = 1                                                  │
│    Dim y2 As Long: y2 = 1                                                  │
│    Cells.ClearContents                                                     │
│    Cells(1, 1).Value = "【一致】"                                          │
│    Cells(1, 2).Value = "【不一致】"                                        │
│    REG.Pattern = "^[A-Z]+$"    ' ここに検証したい正規表現を指定            │
│    Randomize                                                               │
│    For i = 1 To 60000                                                      │
│        検証文字 = ランダム文字生成()                                       │
│        If REG.test(検証文字) Then                                          │
│            y1 = y1 + 1                                                     │
│            Cells(y1, 1).Value = 検証文字                                   │
│        Else                                                                │
│            y2 = y2 + 1                                                     │
│            Cells(y2, 2).Value = 検証文字                                   │
│        End If                                                              │
│    Next i                                                                  │
│End Sub                                                                     │
├──────────────────────────────────────┤
│Private Function ランダム文字生成() As String                               │
│    Dim 結果 As String: 結果 = ""                                           │
│    Dim i As Long, iMax As Long, dw(0 To 2) As String                       │
│    iMax = Int(Rnd * 8) + 4                                                 │
│    For i = 1 To iMax                                                       │
│        dw(0) = Int(Rnd * 10)               ' 数字(0~9)                    │
│        dw(1) = Chr(Int(Rnd * 26) + 65)     ' 英大文字(A~Z)                │
│        dw(2) = Chr(Int(Rnd * 26) + 97)     ' 英小文字(a~z)                │
│        結果 = 結果 & dw(Rnd * 2)                                           │
│    Next i                                                                  │
│    ランダム文字生成 = 結果                                                 │
│End Function                                                                │
└──────────────────────────────────────┘
数値版の場合は以下の通り。
┌──────────────────────────────────────┐
│Option Explicit                                                             │
├──────────────────────────────────────┤
│Public Sub 正規表現のモンテカルロ法による検証数値版()                       │
│    Dim REG As Object: Set REG = CreateObject("VBScript.RegExp")            │
│    Dim i As Long, 検証数値 As Long                                         │
│    Dim y1 As Long: y1 = 1                                                  │
│    Dim y2 As Long: y2 = 1                                                  │
│    Cells.ClearContents                                                     │
│    Cells(1, 1).Value = "【一致】"                                          │
│    Cells(1, 2).Value = "【不一致】"                                        │
│    REG.Pattern = "^(?:0|[1-9]|1[0-2])$"    ' ここに検証したい正規表現を指定│
│    Randomize                                                               │
│    For i = 1 To 60000                                                      │
│        検証数値 = Int(Rnd * 65536)                                         │
│        If REG.test(検証数値) Then                                          │
│            y1 = y1 + 1                                                     │
│            Cells(y1, 1).Value = 検証数値                                   │
│        Else                                                                │
│            y2 = y2 + 1                                                     │
│            Cells(y2, 2).Value = 検証数値                                   │
│        End If                                                              │
│    Next i                                                                  │
│End Sub                                                                     │
└──────────────────────────────────────┘
分類:ExcelVBA