Generating Random Strings

The following function generates random data using a format string that you can customize. The following example can be found in the RandomString.vbs and RandomString.py files located in the <Installdir>\CodeSamplesPlus folder.

VBScript sample

Copy code
' Source code
Randomize (timer)

' Declaration of all formats
' Note that a token contained within a second token (e.g. yy to yyyy) must be placed AFTER the containing token (yyyy must precede yy)
FormatArray = Array("#", "DAY", "MONTH", "dd", "mm", "yyyy", "yy", "NAME", "COLOR", "CAR")

' Definition of formats not appearing as a Case in GetRandStrForToken
Dim        ValuesArray
        ValuesArray = _
            Array(_
            Array("DAY", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"),_
            Array("MONTH", "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"),_
            Array("COLOR", "Red", "Yellow", "Blue", "Green"),_
            Array("NAME", "Hilik", "Oren", "Shoshi", "Ilan"),_
            Array("CAR", "Ford", "Toyota", "Lexus", "Mazda")_
            )

' Generate a random value for a specific token
Function GetRandStrForToken(sToken)
    Select Case sToken
        Case "#"' Single digit
            GetRandStrForToken = CStr(Int(Rnd*10))
        Case "dd"' May (numeric)
            GetRandStrForToken = CStr (Int(Rnd*31 + 1))
        Case "mm"' Month (numeric)
            GetRandStrForToken = CStr (Int(Rnd*12 + 1))
        Case "yy"' Two digit Year
            GetRandStrForToken = CStr(Int(Rnd*10)) + CStr(Int(Rnd*10))
        Case "yyyy"' Four digit Year
            GetRandStrForToken = CStr (1950 + Int(Rnd * 100))
        Case Else ' Pick from the Values Array for other formats
            'LookUpArray
            For i = 0 to UBound(ValuesArray)
                If sToken = ValuesArray(i)(0) Then
                    GetRandStrForToken = ValuesArray(i)( 1 + Int( rnd*(UBound(ValuesArray(i))) ) )
                    Exit For
                End If
            Next
    End Select
End Function

' Parse the current token (if any)
Function GetNextToken (ByRef sFormat)
    For each sToken in FormatArray
        sTemp = Mid(sFormat, 1, Len(sToken))
        If sTemp = sToken Then
            GetNextToken = sToken
            sFormat = Mid(sFormat, Len(sToken) + 1)
            Exit Function
        End If
    Next
End Function

' Generate random data given a format
Function GenerateRandData(ByVal Format)

    Dim nPos
    Dim nLength

    nLength = Len(Format)

    While nLength > 0

        ’ Anything inside a [] brackets is copied as is
        If Mid(Format, 1, 1) = "[" Then ' Find the closing brackets
            nPos = InStr(1, Format, "]", vbTextCompare)
            If nPos = 0 Then Exit Function

            GenerateRandData = GenerateRandData + Mid(Format, 2, nPos - 2)
            Format = Mid(Format, nPos + 1)
            nLength = Len(Format)
        Else
            ’ Search for a valid token
            sToken = GetNextToken(Format)
            If Not sToken = "" Then
                GenerateRandData = GenerateRandData + GetRandStrForToken(sToken)
                nLength = Len(Format)
            Else ' No token - just copy the current character
                GenerateRandData = GenerateRandData + Mid(Format,1, 1)
                If nLength = 1 Then
                    Exit Function
                End If
                Format = Mid(Format, 2)
                nLength = Len(Format)
            End If
        End If
    Wend
End Function

' Usage
msgbox GenerateRandData ("Today Is the first DAY in MONTH")
msgbox GenerateRandData ("A Date in the format [dd/mm/yyyy] dd/mm/yyyy")
msgbox GenerateRandData ("My name is NAME, I drive a COLOR CAR. you can reach me on +972-54-###-####")

Python sample

Copy code
import random
import time

random.seed(time.time())

FORMAT_TOKENS = ["#", "DAY", "MONTH", "dd", "mm", "yyyy", "yy", "NAME", "COLOR", "CAR"]

VALUES = {
    "DAY": ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
    "MONTH": ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
    "COLOR": ["Red", "Yellow", "Blue", "Green"],
    "NAME": ["Hilik", "Oren", "Shoshi", "Ilan"],
    "CAR": ["Ford", "Toyota", "Lexus", "Mazda"],
}


def get_rand_str_for_token(token):
    if token == "#":
        return str(random.randint(0, 9))
    elif token == "dd":
        return str(random.randint(1, 31))
    elif token == "mm":
        return str(random.randint(1, 12))
    elif token == "yy":
        return f"{random.randint(0, 9)}{random.randint(0, 9)}"
    elif token == "yyyy":
        return str(1950 + random.randint(0, 99))
    else:
        return random.choice(VALUES[token])


def get_next_token(format_str):
    for token in FORMAT_TOKENS:
        if format_str.startswith(token):
            return token, format_str[len(token) :]
    return None, format_str


def generate_rand_data(format_str):
    result = ""

    while format_str:
        if format_str.startswith("["):
            end_pos = format_str.find("]")
            if end_pos == -1:
                break
            result += format_str[1:end_pos]
            format_str = format_str[end_pos + 1 :]
        else:
            token, remainder = get_next_token(format_str)
            if token:
                result += get_rand_str_for_token(token)
                format_str = remainder
            else:
                result += format_str[0]
                format_str = format_str[1:]

    return result


print(generate_rand_data("Today Is the first DAY in MONTH"))
print(generate_rand_data("A Date in the format [dd/mm/yyyy] dd/mm/yyyy"))
print(generate_rand_data("My name is NAME, I drive a COLOR CAR. you can reach me on +972-54-###-####"))