生成随机字符串序列的快速方法

Posted

技术标签:

【中文标题】生成随机字符串序列的快速方法【英文标题】:Fast method to generate random string sequence [duplicate] 【发布时间】:2015-07-17 02:04:33 【问题描述】:

我有一个函数,它返回一个大小为N 的字符串,其中包含一个随机字符序列,形成一个小集合A,B,C,D。我将此行生成为:

def gen_line(N):
  tline = ""
  for i in range(N):
    xrand = random.random()
    if( xrand < 0.25 ):
      ch = "A" 
    elif( xrand < 0.50 ):
      ch = "B" 
    elif( xrand < 0.75 ):
      ch = "C" 
    elif( xrand < 1.00 ):
      ch = "D" 
    else:
      print "ERROR: xrand = %f"%( xrand )
    tline = tline+ch
  return tline

但毫无疑问,这是一种非常低效的做事方式。有没有更好、更 Pythonic 的方法来实现这一点?

【问题讨论】:

所以你的问题不在于速度,而在于你的解决方案有多pythonic? 【参考方案1】:

尝试使用random.choicestr.join

>>> x = 'abcd'
>>> ''.join(random.choice(x) for _ in range(10))
'aabbdbadbc'

【讨论】:

@ndpu random.sample 的问题在于它没有替换的采样。您将无法生成像 'aa' 这样的字符串。 这实际上要慢得多。为什么会这样?如果重要的话,我正在寻找一条长度为 60 的线。它可能需要两倍的时间。 @Laurbert515 它可能会变慢有几个原因,所以我不确定。如果没有严格的测试和源代码分析,基准通常很难解释。你可以试试n = len(x) - 1; ''.join(x[randint(0, n)] for _ in xrange(N)),而不是使用random.choice,谁知道呢,它可能比其他方法更快或更慢。或者只是使用另一个答案中的 np.random.choice。【参考方案2】:

你可以使用np.random.choice:

In [13]:

import random
a = np.array(list('abcd'))
%timeit ''.join(np.random.choice(a, 10000))
​
def gen_line(N):
  tline = ""
  for i in range(N):
    xrand = random.random()
    if( xrand < 0.25 ):
      ch = "A" 
    elif( xrand < 0.50 ):
      ch = "B" 
    elif( xrand < 0.75 ):
      ch = "C" 
    elif( xrand < 1.00 ):
      ch = "D" 
    else:
      print("ERROR: xrand = %f"%( xrand ))
    tline = tline+ch
  return tline
​
%timeit gen_line(10000)
100 loops, best of 3: 6.39 ms per loop
100 loops, best of 3: 11.7 ms per loop

【讨论】:

以上是关于生成随机字符串序列的快速方法的主要内容,如果未能解决你的问题,请参考以下文章

R语言使用random包生成随机数或者随机字符串实战:randomNumbers函数创建随机整数的数据集(包含重复项)randomSequence函数创建不含重复项的随机序列数据集创建随机字符串

python 生成随机ASCII字符和数字的连续流。有用的快速生成随机文件。

python之random模块

python生成随机密码

快速随机字符串

python中怎么设置随机产生数字