Генерация случайного числа без диапазона для заданного аргумента для той же длины в python, будь то цифра c или буквенно-цифровой - PullRequest
0 голосов
/ 03 апреля 2020

Генерация случайного числа без диапазона для заданного параметра для той же длины в python, будь то в цифрах c или в алфавитном порядке c

Например:

Я передаю значение моей числовой функции c (123456), тогда функция должна возвращать случайное целое число, скажем 876529 для той же длины, и символы в значении не должны повторяться; случайное число не должно повторяться при вызове функции несколько раз.

то же самое с alphanumeri c: например, если я передам A2ED8I, то функция должна вернуть мне некоторое значение alphanumeri c для той же длины.

Ответы [ 3 ]

1 голос
/ 03 апреля 2020

проведя некоторое исследование, я приду к этому уродливому решению:

Сначала вы создадите список со всеми символами ascii:

value = '1230LE'
t = list('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789')

Затем удалите из этой длинной строки символ значения присутствует в вашем строковом значении (используя t.index, чтобы найти индекс символа):

for c in value:
   del t[t.index(c)]
# Output (without '1', '2', '3', '0', 'L', 'E')
# ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','F','G','H','I','J','K','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','4','5','6','7','8','9']

Тогда вам нужно только сделать генератор basi c на основе вашей новой строки:

from random import choice
n = len(value)
str_characters = ''.join(t) # 'abcdefghijklmnopqrstuvwxyzABCDFGHIJKMNOPQRSTUVWXYZ456789'
generated_value = [choice(str_characters) for i in range(n)] # ['7', 'l', 'N', 'j', 'c', 'i']
''.join(generated_value) #'7lNjci'

Вот вам, это сложное решение, но оно работает.

Если вы хотите сделать это только для чисел c, вы можете использовать это значение для t:

t = list('0123456789')

Полный код:

value = '1230LE'
t = list('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789')
for c in value:
   del t[t.index(c)]
from random import choice
n = len(value)
str_characters = ''.join(t) # 'abcdefghijklmnopqrstuvwxyzABCDFGHIJKMNOPQRSTUVWXYZ456789'
generated_value = [choice(str_characters) for i in range(n)] # ['7', 'l', 'N', 'j', 'c', 'i']
''.join(generated_value) #'7lNjci'

Надеюсь, это поможет, весело проведите время!

1 голос
/ 03 апреля 2020
  1. Для строк: случайное перемешивание букв AZ и чисел 0-9 и возвращает длину входного начального числа
  2. Для чисел: перемешивает цифры 0-9 и преобразуется в число для возврата
  3. Перестановка основана на вводе (либо строка, либо число)

Код

import random
import string

def rand_gen(seed):
  " Generate random strings and numbers based upon seed "

  # Seed random number generator for shuffling
  random.seed(seed)

  # Alphabet based upon type of input (string or integer)
  if isinstance(seed, int):
    # Result based upon numbers 0-9
    alphabet = string.digits
    seed = str(seed)
    is_int = True
  else:
    # Result uses letters in upon A-Z and 0-9
    alphabet = string.ascii_uppercase + string.digits
    is_int = False

  # Output based upon random shuffling of alphabet
  x = list(alphabet)
  while True:
    random.shuffle(x)
    if x[0] != '0' or not is_digit:  # Avoid left most digit being 0 for when working with numbers
      break 

  output = ''.join(x[:len(seed)])
  if is_int:
    return int(output)
  else:
    return output

Проверка

for i in range(1, 15):
  print(f'Numeric Seed: {i:<12} \tString: {rand_gen(i)}')

for i in range(1, 10):
  seed = 'a'*i
  print(f'Charact Seed: {seed:<12} String: {rand_gen(seed)}')

Выход

Ширина выхода такая же, как у входного семени

Numeric Seed: 1             String: 6
Numeric Seed: 2             String: 5
Numeric Seed: 3             String: 1
Numeric Seed: 4             String: 8
Numeric Seed: 5             String: 2
Numeric Seed: 6             String: 5
Numeric Seed: 7             String: 8
Numeric Seed: 8             String: 8
Numeric Seed: 9             String: 9
Numeric Seed: 10            String: 52
Numeric Seed: 11            String: 26
Numeric Seed: 12            String: 89
Numeric Seed: 13            String: 30
Numeric Seed: 14            String: 90
Charact Seed: a            String: Q
Charact Seed: aa           String: ZX
Charact Seed: aaa          String: 5DE
Charact Seed: aaaa         String: 3AV7
Charact Seed: aaaaa        String: I2J76
Charact Seed: aaaaaa       String: ZRHENX
Charact Seed: aaaaaaa      String: R17ZXV4
Charact Seed: aaaaaaaa     String: QEGZYTNA
Charact Seed: aaaaaaaaa    String: VDIFQO7SH
0 голосов
/ 03 апреля 2020

Сначала попробуйте проверить, является ли ввод целым числом или alphanumeri c. isinstance() должно помочь с этим.

На основании этого решения вы можете затем выбрать случайные числа или случайные буквы. Вы можете получить длину вашего ввода через len() (хотя, если это целое число, вам придется сначала изменить его на другой тип).

Случайно генерируемые числа могут быть сделаны с помощью случайной библиотеки.

Произвольно генерировать буквы можно путем случайного генерирования чисел и преобразования их в буквы. Проверьте ord() и chr().

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