Python中的随机字符串

RHi*_*cke 86 python

如何在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
Run Code Online (Sandbox Code Playgroud)

sth*_*sth 211

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

import random, string

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

结果:

>>> randomword(10)
'vxnxikmhdc'
>>> randomword(10)
'ytqhdohksy'
Run Code Online (Sandbox Code Playgroud)

  • 对于Python 3兼容性,请使用`string.ascii_lowercase` (29认同)
  • `random.choices(string.ascii_lowercase, k=length)` (5认同)
  • 从 Python 3.6 开始,`random.choices` 会更快。 (4认同)
  • 到目前为止最佳答案.不过,我会使用`randomword(length,source_alpha = string.lowercase)`和`xrange(length)`. (3认同)
  • 请注意,虽然这是一个非常好的答案,但OP修改了问题以使其无效。并提供他/她自己的答案。 (2认同)

Bra*_*don 53

由于这个问题是公平的,呃,随机,这可能适合你:

>>> import uuid
>>> print uuid.uuid4()
58fe9784-f60a-42bc-aa94-eb8f1a7e5c17
Run Code Online (Sandbox Code Playgroud)

  • 在许多情况下,实际上不需要随机.相反,你真正需要的只是独一无二的. (5认同)
  • 如果你想将它用作字符串,你可以使用“str(uuid.uuid4())”。 (3认同)
  • `str(uuid.uuid4()).split("-")[0]` 输出:`'4bcb6450'` (2认同)

gho*_*g74 31

>>> import random
>>> import string
>>> s=string.lowercase+string.digits
>>> ''.join(random.sample(s,10))
'jw72qidagk
Run Code Online (Sandbox Code Playgroud)

  • random.sample将从s中采样唯一字符,即密码中的字符永远不会重复.这比使用随机答案中的random.choice要安全得多. (13认同)
  • @NickZalutskiy:`random.choice`也不安全.使用`random.SystemRandom().choice()`或[直接使用`os.urandom()`(http://stackoverflow.com/a/16310739/4279). (3认同)
  • 在 Python 3 中,“lowercase”应替换为“ascii_lowercase” (3认同)

Tom*_*Tom 15

回答原始问题:

os.urandom(n)
Run Code Online (Sandbox Code Playgroud)

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

返回一串适合加密使用的n个随机字节.

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

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


Jim*_*Jim 6

有时,我想要一些半可发音、半可记忆的随机字符串。

import random

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

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

然后,

>>> randomWord()
nibit
>>> randomWord()
piber
>>> randomWord(10)
rubirikiro
Run Code Online (Sandbox Code Playgroud)

为了避免出现 4 个字母的单词,请勿设置length为 4。

吉姆


Stu*_*all 6

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

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))
Run Code Online (Sandbox Code Playgroud)


Ros*_*ers 5

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

import random
print chr(random.randint(0,255))
Run Code Online (Sandbox Code Playgroud)

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

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


MAK*_*MAK 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)
Run Code Online (Sandbox Code Playgroud)