Python中的随机字符串


96

如何在Python中创建随机字符串?

我需要先编号然后重复字符,直到完成为止

def random_id(length):
    number = '0123456789'
    alpha = 'abcdefghijklmnopqrstuvwxyz'
    id = ''
    for i in range(0,length,2):
        id += random.choice(number)
        id += random.choice(alpha)
    return id

更具体地说,给出一些您要查找的示例。
sberry 2010年

Answers:


223

从(例如)小写字符生成字符串:

import random, string

def randomword(length):
   letters = string.ascii_lowercase
   return ''.join(random.choice(letters) for i in range(length))

结果:

>>> randomword(10)
'vxnxikmhdc'
>>> randomword(10)
'ytqhdohksy'

3
到目前为止最好的答案。我会用randomword(length, source_alpha=string.lowercase)xrange(length)
汉克·盖伊

1
请注意,尽管这是一个很好的答案,但OP修改了该问题以使其无效。并提供自己的答案。
布莱尔·康拉德

29
为了与Python 3兼容,请使用string.ascii_lowercase
dogwynn '16

@BlairConrad:我想说的问题太广泛了,例如,os.urandom(length)回答了原始问题,并且@sth误读了OP的想法。
jfs

1
从Python 3.6开始,random.choices速度会更快。
IanS '18年

58

由于这个问题是相当随机的,所以这可能对您有用:

>>> import uuid
>>> print uuid.uuid4()
58fe9784-f60a-42bc-aa94-eb8f1a7e5c17

6
在很多情况下,并不是真正需要随机的。相反,您真正需要的是唯一的。
Chase Seibert,2010年

1
str(uuid.uuid4())如果您想将其用作字符串,则可以使用。
Swagatika

2
str(uuid.uuid4()).split("-")[0]输出:'4bcb6450'
Vlad Gulin

好点,弗拉德。对于更长的时间,''.join(str(uuid.uuid4())。split('-'))也可以。输出:“ 00db8a458c71415c9a263ff08667dd93”
布兰登

35
>>> import random
>>> import string
>>> s=string.lowercase+string.digits
>>> ''.join(random.sample(s,10))
'jw72qidagk

整齐!我现在实际上正在将其用于随机密码生成器!谢谢!
chandsie 2011年

13
random.sample将采样来自s的唯一字符,即密码中的字符将永远不会重复。这比接受的答案中使用random.choice的安全性要低得多。
Nick Zalutskiy 2012年

3
@NickZalutskiy:random.choice也不安全。使用random.SystemRandom().choice()直接使用os.urandom()
jfs

1
警告!注意上面的两个评论。random.sample返回唯一的样本。字符不重复。因此返回的字符串的随机性较低。对于较大的字符串错误:“ ValueError:样本大于总体”。
gaoithe

1
在Python 3中,lowercase应替换为ascii_lowercase
Attaque

18

回答原始问题:

os.urandom(n)

引用自:http : //docs.python.org/2/library/os.html

返回适合加密用途的n个随机字节的字符串。

该函数从特定于操作系统的随机性源返回随机字节。尽管返回的数据的确切质量取决于操作系统的实现,但是对于加密应用程序而言,返回的数据应该足够不可预测。在类似UNIX的系统上,它将查询/ dev / urandom,在Windows上,它将使用CryptGenRandom。如果找不到随机源,则将引发NotImplementedError。

有关平台所提供的随机数生成器的易于使用的界面,请参阅random.SystemRandom。


5

您可以构建随机的ascii字符,例如:

import random
print chr(random.randint(0,255))

然后构建一个更长的字符串,例如:

len = 50
print ''.join( [chr(random.randint(0,255)) for i in xrange(0,len)] )

1
为什么要使用字符串格式?''.join(map(chr, random.randint(0,256) for _ in xrange(len)))
克里斯·卢茨

5

关于所需的随机字符串类型,您实际上并没有说太多。但是无论如何,您都应该研究该random模块。

下面粘贴了一个非常简单的解决方案。

import random

def randstring(length=10):
    valid_letters='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    return ''.join((random.choice(valid_letters) for i in xrange(length)))

print randstring()
print randstring(20)

可以在return语句中省略最外层的paren。
递归

4

有时,我想要的是半发音,半记忆的随机字符串。

import random

def randomWord(length=5):
    consonants="bcdfghjklmnpqrstvwxyz"
    vowels="aeiou"

    return "".join(random.choice((consonants,vowels)[i%2]) for i in range(length))

然后,

>>> randomWord()
nibit
>>> randomWord()
piber
>>> randomWord(10)
rubirikiro

为避免使用4个字母的单词,请不要设置length为4。

吉姆


3
random_name = lambda length: ''.join(random.sample(string.letters, length))

长度必须为<= len(string.letters)=53。结果示例

   >>> [random_name(x) for x in range(1,20)]
['V', 'Rq', 'YtL', 'AmUF', 'loFdS', 'eNpRFy', 'iWFGtDz', 'ZTNgCvLA', 'fjUDXJvMP', 'EBrPcYKUvZ', 'GmxPKCnbfih', 'nSiNmCRktdWZ', 'VWKSsGwlBeXUr', 'i
stIFGTUlZqnav', 'bqfwgBhyTJMUEzF', 'VLXlPiQnhptZyoHq', 'BXWATvwLCUcVesFfk', 'jLngHmTBtoOSsQlezV', 'JOUhklIwDBMFzrTCPub']
>>> 

请享用。;)



0

此函数生成由大写,小写字母,数字组成的随机字符串,传递长度分隔符,no_of_blocks以指定您的字符串格式

例如:len_sep = 4,no_of_blocks = 4将生成以下模式,

F4nQ-Vh5z-JKEC-WhuS

长度分隔符将在4个字符后添加“-”

XXXX-

没有块将生成以下字符组成的字符串

XXXX-XXXX-XXXX-XXXX

如果需要单个随机字符串,则只需使no_of_blocks变量等于1,并保持len_sep来指定随机字符串的长度。

例如:len_sep = 10,no_of_blocks = 1,将生成以下模式,即。长度为10的随机字符串,

F01xgCdoDU

import random as r

def generate_random_string(len_sep, no_of_blocks):
    random_string = ''
    random_str_seq = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
    for i in range(0,len_sep*no_of_blocks):
        if i % len_sep == 0 and i != 0:
            random_string += '-'
        random_string += str(random_str_seq[r.randint(0, len(random_str_seq) - 1)])
    return random_string

0
import random 
import string

def get_random_string(size):
    chars = string.ascii_lowercase+string.ascii_uppercase+string.digits
    ''.join(random.choice(chars) for _ in range(size))

print(get_random_string(20)

输出:FfxjmkyyLG5HvLeRudDS


0

python3.6+你可以使用secrets模块

机密模块用于生成适合于管理数据(例如密码,帐户身份验证,安全令牌和相关机密)的密码学强随机数。

特别是,应优先使用随机模块中默认的伪随机数生成器(它是为建模和仿真而不是安全性或密码术设计的)中的默认伪随机数生成器。

在测试768bit安全令牌的生成时,我发现:

  • random.choices() -- 0.000246
  • secrets.choice() -- 0.003529

这些secrets模块速度较慢,但​​是在测试之外,您应该将其用于加密目的:

import string, secrets

def random_string(size):        
        letters = string.ascii_lowercase+string.ascii_uppercase+string.digits            
        return ''.join(secrets.choice(letters) for i in range(size))

print(random_string(768))

-1

尝试从随机导入中导入以下软件包*


这根本解决不了这个问题。是否有更好的(pythonic)方式来随机生成此模式
drekbour
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.