Python генератор случайных строк / текста / кода с фиксированной длиной и некоторыми символами - PullRequest
0 голосов
/ 11 января 2020

Итак, через несколько лет go я обнаружил эксплойт в системе подарочных карт в McDonalds. Основа c состоит в том, что, комбинируя около 15-20 карт и их коды, я понял, что 3-й и 7-й символы совпадают, а остальные абсолютно случайны.

Я мог бы найти То же самое на новом фестивале кока-колы, который проводится в моем районе (Турция). Я просто хотел спросить, как я могу разработать код со случайным модулем, который будет случайным образом создавать коды, используя алгоритм c, например, давайте go с теми же 3-м и 7-м символами снова.

Сохраняя их, случайным образом генерируйте 8 пронумерованных / буквенных кодов. Также я думаю, что используя while True было бы лучше генерировать бесконечное их количество. Я наконец добавлю их в список. Тем не менее, мне нужна помощь в средней части.

import random
import string

def randomStringDigits(stringLength=6):
    lettersAndDigits = string.ascii_letters + string.digits
    return ''.join(random.choice(lettersAndDigits) for i in range(stringLength))

print ("Generating a Random String including letters and digits")
while True:
    print ("First Random String is  ", randomStringDigits(8))

Ответы [ 3 ]

1 голос
/ 11 января 2020

Ты почти там. Я только немного подправил - вы можете настроить его так:

import random

numcount = 5
fstring = ""
length_of_code_you_want = 12
position_to_keep_constant_1 = 2 # first position to keep constant is position 3, index 2
position_to_keep_constant_2 = 6 # 2nd position to keep constant is position 7, index 6
constant_1 = "J" # the value of the constant at position 3
constant_2 = "L" # the value of the constant at position 7

for num in range(length_of_code_you_want): #strings are 19 characters long
    if random.randint(0, 1) == 1:
        x = random.randint(1, 8)
        x += 96
        fstring += (chr(x).upper())
    elif not numcount == 0:
        x = random.randint(0, 9)
        fstring += str(x)
        numcount -= 1

list_out = list(fstring)
list_out[position_to_keep_constant_1] = str(constant_1)
list_out[position_to_keep_constant_2] = str(constant_2)
string_out = "".join(list_out)
print(string_out)
1 голос
/ 11 января 2020

Я не уверен, что это действительно элегантно, но я просто сохранил бы случайную букву в списке, вставил значения в соответствующие позиции, а затем соединил элементы списка в строку.

import random
import string
first = '3' # the first value to place in the 3rd position
second = '7' # the second value to place in the 7th position of the string

def random_string_digits(string_length):
    values = string.ascii_lowercase+string.digits
    output = [random.choice(values) for i in range(string_length)] 
    # the final string length will be equal to string_length+2
    # now that we created the random list of characters, it's time to insert the letter in it
    output.insert(2, first) # insert the first value in the 3rd position
    output.insert(6, second) # insert the second value in the 7th position
    return ''.join(output)
1 голос
/ 11 января 2020

Не уверен насчет законности этого, но проблема достаточно проста.

import random
import string

value_of_seven = 7
value_of_three = 3

def randomString(stringLength=10):
    """Generate a random string of fixed length """
    letters = string.ascii_lowercase
    _string = ''.join(random.choice(letters) for i in range(stringLength))
    print ("Random String is ", randomString() )
    return _string

x = 0
string_set = set()
while x <= 10:
    x += 1
    rand_str = randomString()
    if rand_str[-1, 3] is value_of_seven and rand_str[1, 3] is value_of_three:
        string_set.add(rand_str)

Но нам действительно нужно знать, только буквы в нижнем регистре? Верхний регистр?

Также, если вы пытаетесь сгенерировать их с теми же вещами в тех местах, вы все равно нарежете в той же точке и добавите строку в конце.

Хорошо, вот рабочая версия с вашими требованиями

import random
import string

value_of_seven = '7'
value_of_three = '3'


def _random(stringLength=5):
    """Generate a  string of Ch/digits """
    lett_dig = string.ascii_letters + string.digits
    return ''.join(random.choice(lett_dig) for i in range(stringLength))


if __name__ == '__main__':
    s = _random()
    s = s[:2] + value_of_three + s[2:]
    s = s[:6] + value_of_seven + s[6:]
    print(s)
...