Wygeneruj liczbę losową bez zakresu dla danego parametru o tej samej długości w Pythonie, czy to liczbowo, czy alfanumerycznie

Na przykład :

Przekazuję wartość liczbową (123456) do mojej funkcji, następnie funkcja powinna zwrócić losową liczbę całkowitą, powiedzmy 876529 dla tej samej długości, a znaki w wartości nie powinny się powtarzać, również liczba losowa nie powinna być powtarzalna po wywołaniu funkcji wiele razy.

To samo z alfanumerycznym: na przykład, jeśli przejdę A2ED8I, funkcja powinna zwrócić mi jakąś wartość alfanumeryczną dla tej samej długości.

-1
Ajay Mathews 3 kwiecień 2020, 05:29

3 odpowiedzi

Najlepsza odpowiedź
  1. Dla łańcuchów: Losowe tasowanie liter A-Z i cyfr 0-9 i zwraca długość wejściowego ziarna
  2. W przypadku liczb: tasuje cyfry od 0 do 9 i konwertuje je na liczbę, która ma zostać zwrócona
  3. Tasowanie jest oparte na danych wejściowych (ciąg lub liczba)

Kod

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

Testuj

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)}')

Wyjście

Szerokość wyjściowa taka sama jak nasion wejściowych

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
1
DarrylG 3 kwiecień 2020, 04:08

Najpierw spróbuj sprawdzić, czy dane wejściowe są liczbą całkowitą, czy alfanumeryczną. isinstance() powinno w tym pomóc.

Opierając się na tej decyzji, możesz wybrać generowanie liczb losowych lub losowych liter. Możesz uzyskać długość danych wejściowych przez len() (chociaż jeśli jest to liczba całkowita, musisz najpierw zmienić ją na inny typ).

Losowe generowanie liczb można wykonać za pomocą biblioteki losowej.

Losowe generowanie liter można wykonać, generując losowo liczby i konwertując je na litery. Sprawdź ord() i chr().

0
Paul Ngo 3 kwiecień 2020, 02:48

Przeprowadzając badania, otrzymam to brzydkie rozwiązanie:

Najpierw wygenerujesz listę ze wszystkimi znakami ascii:

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

Następnie usuń z tego długiego ciągu znak wartości obecny w wartości ciągu (używając t.index do znalezienia indeksu znaku):

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']

Następnie wystarczy wykonać podstawowy generator na podstawie nowego ciągu:

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'

Proszę bardzo, to trudne rozwiązanie, ale działa.

Jeśli chcesz to zrobić tylko dla liczb, możesz użyć tej wartości dla t:

t = list('0123456789')

Pełny kod:

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'

Mam nadzieję, że to pomoże, baw się dobrze!

1
Zenocode 3 kwiecień 2020, 03:33