为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

交互式爱情 2022-07-26 16:07:58
我需要随机生成一个只有'y'和'n'的定长字符串,字符串中'n'的个数由变量Njk决定。字符串必须像'yyyyynynynyyyyyy'或'yynyyyyyyyyyyy',我会生成大量的字符串。目前我正在做下面的代码。问题是,要生成 200 个长度为 16 的字符串,它可以正常工作,但是当我尝试生成 200 个长度为 33 的字符串时,执行需要很长时间,这使我的工作无法进行。我怎样才能以最佳/有效的方式做到这一点?此致!#chaves = 16Njk = 3#Generating a random key statedef 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
查看完整描述

4 回答

?
jeck猫

TA贡献1909条经验 获得超7个赞

random.choices您可以通过设置权重生成只有 2 个字符的随机字符串。如果你得到的ns 比你需要的多或少,丢弃并得到一个新的。下面我用递归函数做到了。


import random


def 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'


查看完整回答
反对 回复 2022-07-26
?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

本质上,您需要选择n应放置 s 的预定义位置数量,并将其他所有内容设置为y:


def generate(length, ns):

    result = ['y'] * length

    for i in random.sample(range(length), ns):

        result[i] = 'n'

    return ''.join(result)


查看完整回答
反对 回复 2022-07-26
?
qq_花开花谢_0

TA贡献1835条经验 获得超7个赞

Njk如果您知道最终字符串的大小和 N 的个数,您可以创建一个以N 和length - NjkY开头的列表。然后,打乱该列表并加入它。


from random import shuffle


final_size = 16

number_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)

这可以输出这样的字符串:


yyyyyyyyyyyyy


yyyyyyyyyyyyy


yyyyyyyyyyyy


查看完整回答
反对 回复 2022-07-26
?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

random 模块提供了一个名为的函数sample,可用于非常有效地生成随机模式


from random import sample


size    = 33

count   = 200

NjK     = 7


yn      = ["n"]*NjK + ["y"]*(size-NjK)

results = [ "".join(sample(yn,size)) for _ in range(count) ]


print(results[:3],"...",results[-3:])

这将使您能够非常快速地生成数千个长模式。


查看完整回答
反对 回复 2022-07-26
  • 4 回答
  • 0 关注
  • 226 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号