de-vraag
  • Pytania
  • Tagi
  • Użytkownicy
Powiadomienia
Nagrody
Rejestracja
Po zarejestrowaniu się, będziesz otrzymywać powiadomienia o odpowiedziach i komentarzach do swoich pytań.
Zaloguj się
Brak tłumaczeń pasujących do Twojego wyszukiwania Jeśli masz już konto, zaloguj się, aby sprawdzić nowe powiadomienia.
Za dodane pytania, odpowiedzi i komentarze przewidziane są nagrody.
Więcej
Źródło
Edytuj
 Hellnar
Hellnar
Question

Generowanie losowych ciągów znaków z dużymi literami i cyframi

Chcę wygenerować ciąg znaków o rozmiarze N.

Powinien on składać się z liczb i wielkich liter angielskich, takich jak:

  • 6U1S75
  • 4Z4UKK
  • U911K4

Jak mogę to osiągnąć w pythoniczny sposób?

1239 2010-02-13T12:23:58+00:00 3
 martineau
martineau
Edytowane pytanie 28. marca 2019 в 6:10
Programowanie
random
python
string
Popular videos
Losowe generowanie 9 cyfr
Losowe generowanie 9 cyfr
5 lat temu
Losowe zadania maturalne - Generator
Losowe zadania maturalne - Generator
3 lata temu
Generowanie losowych danych z biblioteką JavaFaker
Generowanie losowych danych z biblioteką JavaFaker
4 miesiące temu
Excel - Generowanie losowych kodów - Funkcja ZNAK i KOD - porada 415
Excel - Generowanie losowych kodów - Funkcja ZNAK i KOD - porada 415
2 lata temu
Kurs C++ odc. 4: Liczby losowe (pseudolosowe)
Kurs C++ odc. 4: Liczby losowe (pseudolosowe)
8 lat temu
Generator liczb losowych - Skalkuluj.pl
Generator liczb losowych - Skalkuluj.pl
3 lata temu
Generator haseł - bezpieczne losowe hasło wg własnych znaków
Generator haseł - bezpieczne losowe hasło wg własnych znaków
2 lata temu
[13] (C#) Proste algorytmy: kontrola parzystości, wartość bezwzględna, suma cyfr liczby
[13] (C#) Proste algorytmy: kontrola parzystości, wartość bezwzględna, suma cyfr liczby
4 lata temu
Excel kurs - Funkcja LOS, LOS.ZAKR
Excel kurs - Funkcja LOS, LOS.ZAKR
4 lata temu
Zamiana liczb - system dwójkowy, szesnastkowy, ósemkowy, dziesiętny
Zamiana liczb - system dwójkowy, szesnastkowy, ósemkowy, dziesiętny
8 lat temu
Historia kryptografii 8/8 - Generatory liczb pseudolosowych
Historia kryptografii 8/8 - Generatory liczb pseudolosowych
7 lat temu
Generowanie liczb bez powtórzeń
Generowanie liczb bez powtórzeń
1 rok temu
Excel - Jak wyciągnąć fragment tekstu o różnej długości
Excel - Jak wyciągnąć fragment tekstu o różnej długości
3 lata temu
Liczby losowe i moduł Random [Python] odc. 12 z serii podstaw Pythona
Liczby losowe i moduł Random [Python] odc. 12 z serii podstaw Pythona
2 lata temu
Kurs Microsoft Excel 2010 odcinek 9 - Wprowadzanie ciągów - liczb i tekstów
Kurs Microsoft Excel 2010 odcinek 9 - Wprowadzanie ciągów - liczb i tekstów
7 lat temu
« Poprzedni
Następny »
To pytanie ma 1 odpowiedź w języku angielskim, aby je przeczytać zaloguj się na swoje konto.
Solution / Answer
Ignacio Vazquez-Abrams
Ignacio Vazquez-Abrams
13. lutego 2010 в 12:26
2010-02-13T12:26:22+00:00
Więcej
Źródło
Edytuj
#10059284

Odpowiedź w jednej linii:

''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(N))

lub nawet krócej, zaczynając od Pythona 3.6, używając random.choices():

''.join(random.choices(string.ascii_uppercase + string.digits, k=N))

Bezpieczniejsza kryptograficznie wersja; zobacz https://stackoverflow.com/a/23728630/2213647:.

''.join(random.SystemRandom().choice(string.ascii_uppercase + string.digits) for _ in range(N))

W szczegółach, z czystą funkcją do dalszego wykorzystania:

>>> import string
>>> import random
>>> def id_generator(size=6, chars=string.ascii_uppercase + string.digits):
...    return ''.join(random.choice(chars) for _ in range(size))
...
>>> id_generator()
'G5G74W'
>>> id_generator(3, "6793YUIO")
'Y3U'

**Jak to działa?

Importujemy string, moduł zawierający sekwencje zwykłych znaków ASCII, oraz random, moduł zajmujący się generowaniem losowym.

String.ascii_uppercase + string.digits` po prostu konkatenuje listę znaków reprezentujących wielkie litery ASCII oraz cyfry:

>>> string.ascii_uppercase
'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
>>> string.digits
'0123456789'
>>> string.ascii_uppercase + string.digits
'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'

Następnie używamy list comprehension, aby utworzyć listę 'n' elementów:

>>> range(4) # range create a list of 'n' numbers
[0, 1, 2, 3]
>>> ['elem' for _ in range(4)] # we use range to create 4 times 'elem'
['elem', 'elem', 'elem', 'elem']

W powyższym przykładzie używamy [ do utworzenia listy, ale nie w funkcji id_generator, więc Python nie tworzy listy w pamięci, ale generuje elementy w locie, jeden po drugim (więcej na ten temat tutaj).

Zamiast prosić o utworzenie 'n' razy łańcucha elem, poprosimy Pythona o utworzenie 'n' razy losowego znaku, wybranego z ciągu znaków:

>>> random.choice("abcde")
'a'
>>> random.choice("abcde")
'd'
>>> random.choice("abcde")
'b'

Dlatego random.choice(chars) for _ in range(size) naprawdę tworzy ciąg znaków size. Znaków, które są losowo wybierane z chars:

>>> [random.choice('abcde') for _ in range(3)]
['a', 'b', 'b']
>>> [random.choice('abcde') for _ in range(3)]
['e', 'b', 'e']
>>> [random.choice('abcde') for _ in range(3)]
['d', 'a', 'c']

Następnie po prostu łączymy je z pustym ciągiem, więc sekwencja staje się ciągiem:

>>> ''.join(['a', 'b', 'b'])
'abb'
>>> [random.choice('abcde') for _ in range(3)]
['d', 'c', 'b']
>>> ''.join(random.choice('abcde') for _ in range(3))
'dac'
 Albert
Albert
Edytowana odpowiedź 4. sierpnia 2018 в 7:28
2401
0
Anurag Uniyal
Anurag Uniyal
13. lutego 2010 в 12:44
2010-02-13T12:44:48+00:00
Więcej
Źródło
Edytuj
#10059285

Prostszym, szybszym, ale nieco mniej losowym sposobem jest użycie random.sample zamiast wybierania każdej litery osobno, Jeśli n-powtórzeń jest dozwolonych, powiększ swoją losową bazę o n razy np.

import random
import string

char_set = string.ascii_uppercase + string.digits
print ''.join(random.sample(char_set*6, 6))

Uwaga: random.sample zapobiega ponownemu użyciu znaków, zwielokrotnienie rozmiaru zestawu znaków sprawia, że wielokrotne powtórzenia są możliwe, ale nadal są mniej prawdopodobne niż w przypadku czystego losowego wyboru. Jeśli wybierzemy ciąg o długości 6, i wybierzemy 'X' jako pierwszy znak, w przykładzie wyboru, prawdopodobieństwo otrzymania 'X' jako drugiego znaku jest takie samo jak prawdopodobieństwo otrzymania 'X' jako pierwszego znaku. W implementacji random.sample szanse na otrzymanie 'X' jako dowolnego kolejnego znaku są tylko 6/7 szans na otrzymanie go jako pierwszego znaku.

Anurag Uniyal
Anurag Uniyal
Edytowana odpowiedź 13. lutego 2016 в 7:44
44
0
 nemesisfixx
nemesisfixx
10. lutego 2012 в 11:27
2012-02-10T23:27:19+00:00
Więcej
Źródło
Edytuj
#10059286

Myślałem, że nikt nie odpowiedział na to jeszcze lol! Ale hej, tutaj'jest mój własny go na to:

import random

def random_alphanumeric(limit):
    #ascii alphabet of all alphanumerals
    r = (range(48, 58) + range(65, 91) + range(97, 123))
    random.shuffle(r)
    return reduce(lambda i, s: i + chr(s), r[:random.randint(0, len(r))], "")
Aaron Hall
Aaron Hall
Edytowana odpowiedź 28. lutego 2014 в 10:31
9
0
Dodaj pytanie
Kategorie
Wszystkie
Technologia
Kultura / Rekreacja
Życie / Sztuka
Nauka
Profesjonalny
Biznes
Użytkownicy
Wszystkie
Nowy
Popularny
1
365
Zarejestrowany 1 dzień temu
2
True Image
Zarejestrowany 1 dzień temu
3
archana agarwal
Zarejestrowany 3 dni temu
4
Maxim Zhilyaev
Zarejestrowany 6 dni temu
5
adambotsfford adambotsfford
Zarejestrowany 1 tydzień temu
BG
DE
EL
ES
FR
ID
IT
JA
NL
PL
PT
RU
ZH
© de-vraag 2022
Źródło
stackoverflow.com
na podstawie licencji cc by-sa 3.0 z przypisaniem