Generating Random Strings With Repeats and Blanks

Viewed 52

I have been successful in generating random strings, but I am now looking to make sure there are a couple of repeating strings and a couple of blank strings. My current code looks like

import random
import string
import numpy as np

def randomGenerator(length):
#   for i in range(0,16):
    randomString = ''.join(random.choice(string.ascii_uppercase + string.digits) for i in range(length))
    return randomString

for i in range(0,16):
    listOne = [randomGenerator(8)]
    mat = np.array([listOne])
    print(mat)

The output I get:

[['3DYKRYHV']]
[['D78NVRZ1']]
[['4BLPD8IB']]
[['D94C73DQ']]
[['1ZDIC5AJ']]
[['XEEEV4JP']]
[['PM9WQ0WM']]
[['4CK2O7F5']]
[['D4GEPXI8']]
[['MVWNOMY5']]
[['TOSS2USW']]
[['1DCQ5JV0']]
[['UR8UUPL7']]
[['17Y7ZIWF']]
[['EABGQ1X3']]
[['KZVBAZRM']]

The output I am looking For:

[['3DYKRYHV']]
[['D94C73DQ']]
[['        ']]
[['D94C73DQ']]
[['1ZDIC5AJ']]
[['        ']]
[['PM9WQ0WM']]
[['3DYKRYHV']]
[['D4GEPXI8']]
[['3DYKRYHV']]
[['UR8UUPL7']]
[['1DCQ5JV0']]
[['UR8UUPL7']]
[['        ']]
[['EABGQ1X3']]
[['KZVBAZRM']]

Or something close to that. I am need the some strings to repeat and some empty slots.

3 Answers

Just use the same logic:

import random
import string
import numpy as np

def randomGenerator(length):
#   for i in range(0,16):
    randomString = ''.join(random.choice(string.ascii_uppercase + string.digits) for i in range(length))
    return randomString

last_generated = None
for i in range(0,16):
    random_one = randomGenerator(8)
    listOne = random.choice([[random_one],[' '*8],[last_generated]])
    last_generated = random_one
    mat = np.array([listOne])
    print(mat)

output:

[['1X1HB4G9']]
[['        ']]
[['Z5NLBY94']]
[['0QDD90L9']]
[['T0LHDTHF']]
[['T0LHDTHF']]
[['DCG1P5K5']]
[['UDH8IJJF']]
[['UDH8IJJF']]
[['LLHVVL5J']]
[['NWWG7DHC']]
[['NWWG7DHC']]
[['        ']]
[['QQ96U7UR']]
[['WE71CM5X']]
[['OA46GGMN']]

#Note: random.choices() has a parameter k to indicate how many items to pick. It is "with replacement" which means an item can be picked again. So you don't need to use random.choice() in a loop.

#Use if-elif-else block to choose whether to add a random string, a blank string, or a duplicate string according to specified percentages.

import random
import string
import numpy as np

LIST_LENGTH = 16
STR_LENGTH = 8
PERCENT_RANDOM = 70
PERCENT_BLANK  = 18

def random_string_generator(length):
    randomString = ''.join(random.choices(string.ascii_uppercase + string.digits, k=length))
    return randomString

list_one = [[random_string_generator(STR_LENGTH)]]
while len(list_one) < LIST_LENGTH:
    chance = random.randrange(100)
    if chance < PERCENT_RANDOM:
        list_one.append([random_string_generator(STR_LENGTH)])

    elif chance < PERCENT_RANDOM + PERCENT_BLANK:
        list_one.append([' '*STR_LENGTH])

    else:
        list_one.append(random.choice(list_one))

mat = np.array(list_one)
print(mat)

try this:

def randomGenerator(length):
    return ''.join(random.sample(string.ascii_uppercase + string.digits, length))


STR_LENGTH = 8
lst, index, repeat_allow = [" " * STR_LENGTH], 1, True

for i in range(16):

    tmp = randomGenerator(STR_LENGTH)   # Generate a random string

    if repeat_allow:
        lst.append(tmp)
        item = random.sample([lst[0]] + lst[index:], 1)

        if not item[0].strip():
            repeat_allow = False
            index = len(lst) - 1        # The content before index is a non-repeatable item
    else:   # No duplication of previous content
        while tmp in lst[:index]:
            tmp = randomGenerator(STR_LENGTH)   # Call again if the generated string is duplicated
        item = [tmp]
        repeat_allow = True     # The next generated content can be duplicated with the content after the current index

    print(np.array([item]))

OUTPUT:

[['SGWXAOBF']]
[['        ']]
[['RSQIU09X']]
[['        ']]
[['SMVPBITO']]
[['        ']]
[['EICDF1P3']]
[['FZAEK6SV']]
[['GSDPMWZI']]
[['FZAEK6SV']]
[['6POL97Q2']]
[['        ']]
[['5CGYR9AJ']]
[['RZ714TX0']]
[['FGTWUBED']]
[['SVQ618L0']]
Related