生成随机字符串序列的快速方法
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.choice
和str.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函数创建不含重复项的随机序列数据集创建随机字符串