猿问

生成只有两个特定字符的随机字符串

我需要随机生成一个只有'y'和'n'的定长字符串,字符串中'n'的个数由变量Njk决定。字符串必须像'yyyyynynynyyyyyy'或'yynyyyyyyyyyyy',我会生成大量的字符串。目前我正在做下面的代码。问题是,要生成 200 个长度为 16 的字符串,它可以正常工作,但是当我尝试生成 200 个长度为 33 的字符串时,执行需要很长时间,这使我的工作无法进行。我怎样才能以最佳/有效的方式做到这一点?


此致!


#

chaves = 16

Njk = 3


#Generating a random key state

def rand_estado():

    aux2 = randint(0,1)

    if aux2 == 0:

        estado = 'n'

    if aux2 == 1:

        estado = 'y'

    return estado


#Generating a random combination of key states with fixed number of 'y' and 'n'       

def rand_estado_chaves():

    radialidade = 0

    #The condition that must be satisfied

    while (radialidade != chaves - Njk):

        estado_chaves = "" 

        #For each key

        for i in range(chaves):

            estado_chaves += rand_estado()

            radialidade = estado_chaves.count('y')

    return estado_chaves


交互式爱情
浏览 227回答 4
4回答

jeck猫

random.choices您可以通过设置权重生成只有 2 个字符的随机字符串。如果你得到的ns 比你需要的多或少,丢弃并得到一个新的。下面我用递归函数做到了。import randomdef yn_gen(num_n=5, size=30):    candidate = random.choices('yn',         weights=((size-num_n)/size, num_n/size),         k=size)    if candidate.count('n')==num_n:        return ''.join(candidate)    else:        return yn_gen(num_n, size)yn_gen()# returns:'yynnnnyyyyyyyyyyyyyyyyyyyynyyy'yn_gen(10, 50)# returns:'yynynynnyyyyynyyyyyyynyynnyyyyyyyyyynyynyyyyyyyyyy'

海绵宝宝撒

本质上,您需要选择n应放置 s 的预定义位置数量,并将其他所有内容设置为y:def generate(length, ns):    result = ['y'] * length    for i in random.sample(range(length), ns):        result[i] = 'n'    return ''.join(result)

qq_花开花谢_0

Njk如果您知道最终字符串的大小和 N 的个数,您可以创建一个以N 和length - NjkY开头的列表。然后,打乱该列表并加入它。from random import shufflefinal_size = 16number_of_n = 3# ['n', 'n', 'n', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y']result = list('n' * number_of_n + 'y' * (final_size - number_of_n))shuffle(result)result = ''.join(result)print(result)这可以输出这样的字符串:yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy

斯蒂芬大帝

random 模块提供了一个名为的函数sample,可用于非常有效地生成随机模式from random import samplesize    = 33count   = 200NjK     = 7yn      = ["n"]*NjK + ["y"]*(size-NjK)results = [ "".join(sample(yn,size)) for _ in range(count) ]print(results[:3],"...",results[-3:])这将使您能够非常快速地生成数千个长模式。
随时随地看视频慕课网APP

相关分类

Python
我要回答