我还在尝试创建一个半随机的字母列表。我希望我的列表有60个字母,但是我想要相同字母的时间恰好是20%,而不是2个字母。
我做了这段代码:
import random
from random import shuffle
import pandas as pd
probab = range(61)
shuffle(probab)
letters = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L']
my_list = [random.choice(letters) for _ in range(2)]
for i in probab.items():
if i < 12: # choice of number between
my_list.append(my_list[len(my_list)-2]) # add the letter n-2
else:
my_list.append(random.choice(letters))
print(my_list).
我所遇到的逻辑问题是我创建了一个1-60的列表,然后混合它。
在我想要循环之后,代码会查看第一项是否小于12,如果是,则添加相同的字母而不是2,如果不添加随机字母...
我认为12因为,它是60%的20%
运行列出的代码时出现此错误:
for i in probab.items():
AttributeError: 'list' object has no attribute 'items'
感谢您的帮助。
答案 0 :(得分:1)
您的逻辑需要稍微调整:如果您想要重复20%的时间,那么另外80%的时间您必须确保不重复。这样做的简单方法是使用循环。或者,您可以从不包含不需要的字母的字母集合中进行选择,但这更加冗长,并且在生成随机字母时执行额外的循环可能会更快。
此外,由于您需要包含60个字母的列表,probab
必须长度为58.并且无需将letters
设为列表:random.choice
将很乐意从字符串。
from random import choice, shuffle
num = 60
letters = 'ABCDEFGHIJKL'
my_list = [choice(letters), choice(letters)]
probab = list(range(num - 2))
shuffle(probab)
# We want 20% of the letters to repeat the letter 2 letters back
repeatnum = num * 20 // 100
for i in probab:
ch = prev = my_list[-2]
if i >= repeatnum:
while ch == prev:
ch = choice(letters)
my_list.append(ch)
# verify
count = 0
for i in range(2, num):
if my_list[i] == my_list[i - 2]:
count += 1
print(''.join(my_list), len(my_list), count)
典型输出
GBJEBKKKLKGJGKHIBLDKGKCKIKFCABDDBCKFJDEDJLAAADALEIIFICHHEGEG 60 12