-1

这应该最终成为一个随机名称生成器,所有随机部分都在工作。唯一的问题是它真的是随机的,会出现奇怪的东西,比如 aaaaaaaa 等。所以我试图添加一个规则,不允许两个元音接在一起(辅音也是如此)。

所以,是的,请大家帮帮我。我一直在寻找这个代码 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
4

3 回答 3

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))
于 2013-05-11T03:38:47.587 回答
0

您遇到的问题是您的循环总是递增,但如果随机值不匹配,则i只会向您的列表添加一个附加值。这意味着如果您连续获得多个匹配项,可能会变得大于最大索引,因此您将获得异常。xx[i]ixIndexError

我不完全确定我理解你想要做什么,但我认为这会做一些类似于你当前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)
于 2013-05-11T03:58:13.637 回答
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
于 2013-05-11T04:55:03.923 回答