python الدوال - توليد سلسلة عشوائية بأحرف كبيرة وأرقام في بايثون



اكواد لغة (21)

استخدم الدالة random.choice () في Numpy

import numpy as np
import string        

if __name__ == '__main__':
    length = 16
    a = np.random.choice(list(string.ascii_uppercase + string.digits), length)                
    print(''.join(a))

الوثائق موجودة هنا http://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.random.choice.html

أريد إنشاء سلسلة من الحجم N.

يجب أن يتكون من أرقام وحروف إنجليزية كبيرة مثل:

  • 6U1S75
  • 4Z4UKK
  • U911K4

كيف يمكنني تحقيق ذلك بطريقة pythonic ؟


يمكنك استخدام الرمز

var chars = "ABC123";
        var random = new Random();
        var result = new string(
            Enumerable.Repeat(chars, 7) //Change 7 to any number of characters you want in your outcome
                      .Select(s => s[random.Next(s.Length)])
                      .ToArray());

        textBox1.Text = result;

هذا سوف يبصقون عشوائيًا بنمط 7 أبجدي رقمي عشوائي ، ما عليك سوى تغيير الرقم 7 إلى أي رقم ترغب فيه ، وسوف ينتج ذلك العدد من الأرقام و / أو الحروف.

طريقة أخرى لكتابة هذا هو على النحو التالي ...

var chars = "ABC123";
var stringChars = new char[7]; //Change 7 to any number of characters you want in your outcome
var random = new Random();

for (int i = 0; i < stringChars.Length; i++)
{

stringChars[i] = chars[random.Next(chars.Length)];

}

var finalString = new String(stringChars);

textBox1.Text = finalstring;`

أنا غير متأكد من كيفية إضافة قيود مثل جعلها إلى حيث لا تسمح لأرقام و / أو أحرف معينة أن تكون بجانب بعضها البعض أو تتكرر مثل الحصول على "AAA123" إذا كان أي شخص يعرف كيفية تقييد النتيجة للحصول على شيء من هذا القبيل هذا يرجى التعليق مرة أخرى


import string
from random import *
characters = string.ascii_letters + string.punctuation  + string.digits
password =  "".join(choice(characters) for x in range(randint(8, 16)))
print password

يعتبر هذا Quackion أعلى نتيجة Google الحالية لـ "Python string string". الإجابة الأعلى الحالية هي:

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

هذه طريقة ممتازة ، لكن PRNG في عشوائي ليس آمنًا بشكل مشفّر. أفترض أن العديد من الأشخاص الذين يبحثون عن هذا السؤال يريدون إنشاء سلاسل عشوائية للتشفير أو كلمات المرور. يمكنك القيام بذلك بشكل آمن عن طريق إجراء تغيير بسيط في الكود أعلاه:

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

استخدام random.SystemRandom() بدلاً من استخدامات عشوائية / dev / urandom على أجهزة * nix و CryptGenRandom() في Windows. هذه هي PRNGs آمنة التشفير. باستخدام random.choice بدلاً من random.choice random.SystemRandom().choice في تطبيق يتطلب PRNG آمنًا مدمرًا ، ونظرًا لشعبية هذا السؤال ، أراهن أن هذا الخطأ قد تم إجراؤه عدة مرات بالفعل.

إذا كنت تستخدم python3.6 أو أعلى ، فيمكنك استخدام وحدة secrets الجديدة.

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

تناقش مستندات الوحدة النمطية أيضًا الطرق المريحة لتوليد الرموز الآمنة وأفضل الممارسات .


لقد وجدت هذا أبسط وأنظف.

str_Key           = ""
str_FullKey       = "" 
str_CharacterPool = "01234ABCDEFfghij~>()"
for int_I in range(64): 
    str_Key = random.choice(str_CharacterPool) 
    str_FullKey = str_FullKey + str_Key 

كل ما عليك هو تغيير 64 لتغيير الطول ، وتغيير CharacterPool للقيام بالألفا alpha الرقمية فقط أو الرقمية فقط أو أحرف غريبة أو أي شيء تريده.


>>> import string 
>>> import random

لا يزال المنطق التالي يولد 6 عينة عشوائية

>>> print ''.join(random.sample((string.ascii_uppercase+string.digits),6))
JT7K3Q

لا حاجة للتضاعف في 6

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

TK82HK

اعتقدت أن أحدا لم يجيب على هذا بعد! لكن مهلا ، أنا أذهب إليه:

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))], "")

هذا هو أخذ على استجابة Anurag Uniyal وشيئا كنت أعمل على نفسي.

import random
import string

oneFile = open('‪Numbers.txt', 'w')
userInput = 0
key_count = 0
value_count = 0
chars = string.ascii_uppercase + string.digits + string.punctuation

for userInput in range(int(input('How many 12 digit keys do you want?'))):
    while key_count <= userInput:
        key_count += 1
        number = random.randint(1, 999)
        key = number

        text = str(key) + ": " + str(''.join(random.sample(chars*6, 12)))
        oneFile.write(text + "\n")
oneFile.close()

هذه الطريقة هي أسرع قليلا ، وأكثر إزعاجا قليلا ، من طريقة random.choice () نشر Ignacio.

إنه يستفيد من طبيعة الخوارزميات شبه العشوائية ، والبنوك على الببتة ، والتحول أسرع من توليد رقم عشوائي جديد لكل حرف.

# must be length 32 -- 5 bits -- the question didn't specify using the full set
# of uppercase letters ;)
_ALPHABET = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789'

def generate_with_randbits(size=32):
    def chop(x):
        while x:
            yield x & 31
            x = x >> 5
    return  ''.join(_ALPHABET[x] for x in chop(random.getrandbits(size * 5))).ljust(size, 'A')

... إنشاء مولد يأخذ أرقام 5 بت في وقت 0. 31 حتى لا يبقى

... join () نتائج المولد على عدد عشوائي مع البتات الصحيحة

مع Timeit ، للحصول على سلاسل 32 حرف ، كان التوقيت:

[('generate_with_random_choice', 28.92901611328125),
 ('generate_with_randbits', 20.0293550491333)]

... ولكن مع سلاسل الأحرف 64 ، يخسر randbits؛)

ربما لن استخدم هذا النهج أبداً في قانون الإنتاج ما لم أكن حقاً أكره زملائي في العمل.

edit: تم تحديثه ليناسب السؤال (بالأحرف الكبيرة والأرقام فقط) ، واستخدم مشغلي bitwise & and >> بدلاً من٪ و //


من Python 3.6 يجب عليك استخدام وحدة secrets إذا كنت بحاجة إلى أن يكون آمنًا بشكل مشفر بدلاً من الوحدة random (وإلا تكون هذه الإجابة مماثلة لواحدةIgnacio Vazquez-Abrams):

from secrets import choice
import string

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

ملاحظة إضافية واحدة: الفهم قائمة أسرع في حالة str.join من استخدام تعبير مولد!


>>> import random
>>> str = []
>>> chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'
>>> num = int(raw_input('How long do you want the string to be?  '))
How long do you want the string to be?  10
>>> for k in range(1, num+1):
...    str.append(random.choice(chars))
...
>>> str = "".join(str)
>>> str
'tm2JUQ04CK'

تختار الدالة random.choice إدخال عشوائي في قائمة. يمكنك أيضًا إنشاء قائمة حتى يمكنك إلحاق الحرف في العبارة. في نهاية str هو ['t' ، 'm' ، '2' ، 'J' ، 'U' ، 'Q' ، '0' ، '4' ، 'C' ، 'K'] ، ولكن str = "".join(str) يعتني بذلك ، 'tm2JUQ04CK' مع 'tm2JUQ04CK' .

أتمنى أن يساعدك هذا!


لأولئك منكم الذين يتمتعون بيثون وظيفي:

from itertools import imap, starmap, islice, repeat
from functools import partial
from string import letters, digits, join
from random import choice

join_chars = partial(join, sep='')
identity = lambda o: o

def irand_seqs(symbols=join_chars((letters, digits)), length=6, join=join_chars, select=choice, breakup=islice):
    """ Generates an indefinite sequence of joined random symbols each of a specific length
    :param symbols: symbols to select,
        [defaults to string.letters + string.digits, digits 0 - 9, lower and upper case English letters.]
    :param length: the length of each sequence,
        [defaults to 6]
    :param join: method used to join selected symbol, 
        [defaults to ''.join generating a string.]
    :param select: method used to select a random element from the giving population. 
        [defaults to random.choice, which selects a single element randomly]
    :return: indefinite iterator generating random sequences of giving [:param length]
    >>> from tools import irand_seqs
    >>> strings = irand_seqs()
    >>> a = next(strings)
    >>> assert isinstance(a, (str, unicode))
    >>> assert len(a) == 6
    >>> assert next(strings) != next(strings)
    """
    return imap(join, starmap(breakup, repeat((imap(select, repeat(symbols)), None, length))))

فهو يولد إلكترونًا غير محدود [غير محدود] ، من متتابعات عشوائية مشتركة ، من خلال توليد تسلسل غير محدد من الرمز المختار عشوائياً من تجمع التبرعات ، ثم كسر هذا التسلسل إلى أجزاء طويلة يتم ربطها بعد ذلك ، يجب أن يعمل مع أي تسلسل يدعم getitem بشكل افتراضي ، يولد ببساطة تسلسلًا عشوائيًا من الأحرف الرقمية الأبجدية ، على الرغم من أنه يمكنك تعديلها بسهولة لإنشاء أشياء أخرى:

على سبيل المثال لتوليد مجموعات عشوائية من الأرقام:

>>> irand_tuples = irand_seqs(xrange(10), join=tuple)
>>> next(irand_tuples)
(0, 5, 5, 7, 2, 8)
>>> next(irand_tuples)
(3, 2, 2, 0, 3, 1)

إذا كنت لا ترغب في استخدام الجيل التالي ، فيمكنك ببساطة جعله قابلاً للاستدعاء:

>>> irand_tuples = irand_seqs(xrange(10), join=tuple)
>>> make_rand_tuples = partial(next, irand_tuples) 
>>> make_rand_tuples()
(1, 6, 2, 8, 1, 9)

إذا كنت ترغب في توليد التسلسل على الطاير ببساطة تعيين الانضمام إلى الهوية.

>>> irand_tuples = irand_seqs(xrange(10), join=identity)
>>> selections = next(irand_tuples)
>>> next(selections)
8
>>> list(selections)
[6, 3, 8, 2, 2]

كما ذكر آخرون إذا كنت بحاجة إلى مزيد من الأمان ، فاضبط وظيفة الاختيار المناسبة:

>>> from random import SystemRandom
>>> rand_strs = irand_seqs(select=SystemRandom().choice)
'QsaDxQ'

المحدد الافتراضي هو choice الذي قد يحدد نفس الرمز عدة مرات لكل جزء ، إذا كنت تريد بدلاً من ذلك اختيار العضو نفسه مرة واحدة على الأكثر لكل جزء ، ثم استخدام واحد ممكن:

>>> from random import sample
>>> irand_samples = irand_seqs(xrange(10), length=1, join=next, select=lambda pool: sample(pool, 6))
>>> next(irand_samples)
[0, 9, 2, 3, 1, 6]

نستخدم sample كمنتقي لدينا ، للقيام باختيار كامل ، وبالتالي فإن قطع في الواقع طول 1 ، والانضمام ندعو ببساطة next الذي يجلب قطعة التالي بالكامل ولدت ، منح هذا المثال يبدو مرهقا بعض الشيء وهو ...


سأفعلها بهذه الطريقة:

import random
from string import digits, ascii_uppercase

legals = digits + ascii_uppercase

def rand_string(length, char_set=legals):

    output = ''
    for _ in range(length): output += random.choice(char_set)
    return output

أو فقط:

def rand_string(length, char_set=legals):

    return ''.join( random.choice(char_set) for _ in range(length) )

واحد بسيط:

import string
import random
character = string.lowercase + string.uppercase + string.digits + string.punctuation
char_len = len(character)
# you can specify your password length here
pass_len = random.randint(10,20)
password = ''
for x in range(pass_len):
    password = password + character[random.randint(0,char_len-1)]
print password

ببساطة استخدام uiid بايثون مدمج:

إذا كانت UUID مقبولة للأغراض الخاصة بك ، استخدم الحزمة uuid المضمنة.

حل خط واحد:

import uuid; str(uuid.uuid4().get_hex().upper()[0:6])

في إصدار العمق:

مثال:

import uuid
uuid.uuid4() #uuid4 => full random uuid
# Outputs something like: UUID('0172fc9a-1dac-4414-b88d-6b9a6feb91ea')

إذا كنت تحتاج بالضبط إلى التنسيق الخاص بك (على سبيل المثال ، "6U1S75") ، فيمكنك القيام بذلك على النحو التالي:

import uuid

def my_random_string(string_length=10):
    """Returns a random string of length string_length."""
    random = str(uuid.uuid4()) # Convert UUID format to a Python string.
    random = random.upper() # Make all characters uppercase.
    random = random.replace("-","") # Remove the UUID '-'.
    return random[0:string_length] # Return the random string.

print(my_random_string(6)) # For example, D9E50C

طريقة أسرع وأسهل وأكثر مرونة للقيام بذلك هي استخدام وحدة strgen ( pip install StringGenerator ).

إنشاء سلسلة عشوائية من 6 أحرف مع الأحرف الكبيرة والأرقام:

>>> from strgen import StringGenerator as SG
>>> SG("[\u\d]{6}").render()
u'YZI2CI'

احصل على قائمة فريدة:

>>> SG("[\l\d]{10}").render_list(5,unique=True)
[u'xqqtmi1pOk', u'zmkWdUr63O', u'PGaGcPHrX2', u'6RZiUbkk2i', u'j9eIeeWgEF']

ضمان حرف "خاص" واحد في السلسلة:

>>> SG("[\l\d]{10}&[\p]").render()
u'jaYI0bcPG*0'

لون HTML عشوائي:

>>> SG("#[\h]{6}").render()
u'#CEdFCa'

إلخ

نحن بحاجة إلى أن ندرك أن هذا:

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

قد لا يحتوي على رقم (أو حرف كبير) فيه.

strgen هو أسرع في وقت المطور من أي من الحلول المذكورة أعلاه. الحل من Ignacio هو أسرع أداء وقت التشغيل وهو الإجابة الصحيحة باستخدام مكتبة Python القياسية. لكنك لن تستخدمه في هذا الشكل. ستحتاج إلى استخدام SystemRandom (أو الرجوع إذا لم يكن متاحًا) ، تأكد من تمثيل مجموعات الأحرف المطلوبة ، أو استخدام unicode (أو لا) ، تأكد من أن الاستدعاءات المتتالية تنتج سلسلة فريدة ، استخدم مجموعة فرعية من إحدى فئات أحرف وحدة الصفيف ، كل هذا يتطلب الكثير من التعليمات البرمجية أكثر من الإجابات المقدمة. إن المحاولات العديدة لتعميم الحل لها جميع القيود التي تحلها strgen بقدر أكبر من الإيجاز والطاقة التعبيرية باستخدام لغة قالب بسيطة.

إنها على PyPI:

pip install StringGenerator

الإفصاح: أنا مؤلف وحدة strgen.


استناداً إلى إجابة أخرى ، معظم الطرق خفيفة الوزن لإنشاء سلسلة عشوائية ورقم ست عشري عشوائي ، أفضل إصدار من الإجابة المقبولة سيكون:

('%06x' % random.randrange(16**6)).upper()

أسرع بكثير.


أخذ الجواب من Ignacio ، وهذا يعمل مع بيثون 2.6:

import random
import string

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

مثال على الناتج:

JQUBT2


إذا كنت بحاجة إلى سلسلة عشوائية بدلاً من واحدة عشوائية زائفة ، فيجب استخدام os.urandom كمصدر

from os import urandom
from itertools import islice, imap, repeat
import string

def rand_string(length=5):
    chars = set(string.ascii_uppercase + string.digits)
    char_gen = (c for c in imap(urandom, repeat(1)) if c in chars)
    return ''.join(islice(char_gen, None, length))

أود أن أقترح عليك الخيار التالي:

import crypt
n = 10
crypt.crypt("any sring").replace('/', '').replace('.', '').upper()[-n:-1]

الوضع البارانوي:

import uuid
import crypt
n = 10
crypt.crypt(str(uuid.uuid4())).replace('/', '').replace('.', '').upper()[-n:-1]

تزيين الدوال مع عدد مختلف من الحجج:

def frame_tests(fn):
    def wrapper(*args):
        print "\nStart: %s" %(fn.__name__)
        fn(*args)
        print "End: %s\n" %(fn.__name__)
    return wrapper

@frame_tests
def test_fn1():
    print "This is only a test!"

@frame_tests
def test_fn2(s1):
    print "This is only a test! %s" %(s1)

@frame_tests
def test_fn3(s1, s2):
    print "This is only a test! %s %s" %(s1, s2)

if __name__ == "__main__":
    test_fn1()
    test_fn2('OK!')
    test_fn3('OK!', 'Just a test!')

نتيجة:

Start: test_fn1  
This is only a test!  
End: test_fn1  


Start: test_fn2  
This is only a test! OK!  
End: test_fn2  


Start: test_fn3  
This is only a test! OK! Just a test!  
End: test_fn3  




python string random