【问题标题】:How to generate random strings in Python?Python中的随机字符串
【发布时间】:2011-01-03 01:21:18
【问题描述】:

如何在 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

【问题讨论】:

    标签: python


    【解决方案1】:

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

    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。

    吉姆

    【讨论】:

      【解决方案2】:

      python3.6+ 中,您可以使用secrets module

      秘密模块用于生成强密码 适用于管理密码、账户等数据的随机数 身份验证、安全令牌和相关机密。

      特别是,应该优先使用秘密而不是默认值 random模块中的伪随机数发生器,设计 用于建模和仿真,而不是安全或密码学。

      在测试生成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))
      

      【讨论】:

        【解决方案3】:
        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

        【讨论】:

          【解决方案4】:

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

          eg: len_sep = 4, no_of_blocks = 4 会生成如下模式,

          F4nQ-Vh5z-JKEC-WhuS

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

          XXXX-

          no of blocks 将生成以下字符模式作为字符串

          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
          

          【讨论】:

            【解决方案5】:

            安装这个包:

            pip3 install py_essentials
            

            并使用此代码:

            from py_essentials import simpleRandom as sr
            print(sr.randomString(4))
            

            More informations about the method other parameters are available here.

            【讨论】:

              【解决方案6】:

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

              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'
              

              【讨论】:

              • 迄今为止的最佳答案。不过,我会使用randomword(length, source_alpha=string.lowercase)xrange(length)
              • 请注意,尽管这是一个非常好的答案,但 OP 已修改问题以使其无效。并提供他/她自己的答案。
              • 为了兼容 Python 3,请使用 string.ascii_lowercase
              • 如果你更频繁地调用randomword(),这会浪费很多cpu。
              • 从 Python 3.6 开始,random.choices 会更快。
              【解决方案7】:
              random_name = lambda length: ''.join(random.sample(string.letters, length))
              

              长度必须为

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

              享受。 ;)

              【讨论】:

                【解决方案8】:

                回答原问题:

                os.urandom(n)
                

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

                返回适合加密使用的由 n 个随机字节组成的字符串。

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

                为提供的随机数生成器提供易于使用的界面 根据您的平台,请参阅 random.SystemRandom。

                【讨论】:

                  【解决方案9】:
                  >>> import random
                  >>> import string
                  >>> s=string.lowercase+string.digits
                  >>> ''.join(random.sample(s,10))
                  'jw72qidagk
                  

                  【讨论】:

                  • 整洁!我现在实际上正在将它用于随机密码生成器!谢谢!
                  • random.sample 将从 s 中采样唯一字符,即密码中的字符永远不会重复。这比在接受的答案中使用 random.choice 安全得多。
                  • @NickZalutskiy:random.choice 也不安全。使用random.SystemRandom().choice()use os.urandom() directly
                  • 警告!注意上面的两个 cmets。 random.sample 返回唯一的样本。字符不重复。所以返回的字符串不太随机。对于较大的字符串错误:“ValueError:样本大于总体”。
                  • 在 Python 3 中,lowercase 应替换为 ascii_lowercase
                  【解决方案10】:

                  由于这个问题是公平的,呃,随机的,这可能对你有用:

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

                  【讨论】:

                  • 在很多情况下,随机并不是真正需要的。相反,您真正需要的只是独一无二的。
                  • 如果您想将其用作字符串,可以使用str(uuid.uuid4())
                  • str(uuid.uuid4()).split("-")[0] 输出:'4bcb6450'
                  • 好点,弗拉德。对于更长的时间, ''.join(str(uuid.uuid4()).split('-')) 也可以。输出:'00db8a458c71415c9a263ff08667dd93'
                  【解决方案11】:

                  您并没有真正说明您需要什么样的随机字符串。但无论如何,您应该查看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 语句中省略最外面的一组括号。
                  【解决方案12】:

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

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

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

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

                  【讨论】:

                  • 为什么要使用字符串格式? ''.join(map(chr, random.randint(0,256) for _ in xrange(len)))
                  猜你喜欢
                  • 2011-07-26
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2017-05-20
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多