这应该成为一个随机的名称生成器,所有的随机部分都在工作。唯一的问题是它真的是随机的,得到像aaaaaaaa等奇怪的东西。 所以我试图添加一个规则到不允许2个元音相继(与辅音相同)。
所以是的,伙计们请帮助我。我一直在寻找这段代码2小时,我找不到问题。 在这里粘贴我的整个代码。
import random
import string
import numpy as np
from sys import argv
import csv
# abcdefghijklmnopqrstuvwxyz
# Example output: floke fl0ke flok3 fl0k3
#
class facts:
kons = list('bcdfghjklmnpqrstvwxz') #20
voks = list('aeiouy') #6
abc = list('abcdefghijklmnopqrstuvwxyz')
def r_trfa(): #True Or False (1/0)
x = random.randrange(0, 2)
return x;
def r_kons(): #Konsonant
y = random.randrange(0, 20)
x = facts.kons[y]
return x;
def r_vok(): #Vokal
y = random.randrange(0, 6)
x = facts.voks[y]
return x;
def r_len(): #Langd
x = random.randrange(4, 8)
return x;
def r_type():
x = random.randrange(1, 4)
return x;
def r_structure(length): #Skapar strukturen
y = r_type()
if y == 0:
no1 = 1
else:
no1 = 2
i = 0
x = [no1]
y = r_type()
if not no1 == y:
x.append(y)
while i < length:
y = r_type()
if not x[i] == y:
x.append(y)
i = i + 1
x2 = list(x)
return x2;
def name(): #Final product
struct = r_structure(r_len())
name = struct
答案 0 :(得分:0)
你有几个错误。例如,您正在检查值y
是否为0,即使它始终在1-4范围内,可能是非预期的行为。此外,你永远不会实际调用一个能让你成为角色的函数,而你永远不会创建一个字符串。因此,目前尚不清楚你要做什么。
以下是我根据你对你想做什么的猜测重写的事情。
import random, itertools
voks = frozenset('aeiouy')
abc = 'abcdefghijklmnopqrstuvwxyz'
def r_gen():
last=None #both classes ok
while 1:
new = random.choice(abc)
if (new in voks) != last:
yield new
last = (new in voks)
def name(): #Final product
length = random.randrange(4, 8)
return ''.join(itertools.islice(r_gen(), length))
答案 1 :(得分:0)
您遇到的问题是您的循环总是递增i
,但如果随机值与x
不匹配,则只会为x[i]
列表添加额外的值。这意味着,如果您连续获得多个匹配项,i
可能会变得大于x
的最大索引,因此您将获得IndexError
例外。
我不完全确定我明白你要做什么,但我认为这会与你当前的r_structure
功能类似:
def r_structure(length):
"""Returns a list of random "types", avoiding any immediate repeats"""
x = [r_type()]
while len(x) < length:
y = r_type()
if y != x[-1]: # check against the last item in the list
x.append(y)
return x
如果您的目标只是随机生成一系列交替的元音和辅音,那么这种方式比您似乎更容易实现。首先,您可以使用random.choice
来挑选您的角色。此外,您可以简单地从一个字符串中选择,然后从另一个字符串中选择,而不是选择多个字母并拒绝错误类型的字母,只要您需要:
import random
def alternating_characters(length):
characters = ["aeiouy", "bcdfghjklmnpqrstvwxz"]
char_type = random.randrange(2) # pick a random letter type to start with
results = []
while len(char_list) < length:
results.append(random.choice(characters[char_type])) # pick random char
char_type = 1-char_type # pick from the other list next time
return "".join(char_list)
答案 2 :(得分:0)
嗯,目前还不清楚你想做什么..由于元音和辅音的条件是一样的,你为什么需要区分它们呢?
所以你需要做的就是随机写一封信,检查它是否与最后一个字母不符。 这是一些代码:
import random
abc = 'abcdefghijklmnopqrstuvwxyz'
def gen_word(length):
last = ''
while length > 0:
l = random.choice(abc)
if l != last:
length -= 1
yield l
if __name__ == '__main__':
word = ''.join(gen_word(10))
print word