使用辅音和元音生成名称列表

时间:2016-01-10 16:48:46

标签: vb.net

我正在尝试生成一个名称列表,如“ala”,“oja”,“kay”,“zur” 而不是“nno”,“ooz”,“zii”,但我的功能陷入了无限循环,哪里错了?

Function getName(num_letters As Integer) As List(Of String)
    Dim values As New List(Of String)
    Dim new_values As New List(Of String)
    Dim allChars() As Char = "aeiouykzrsdjlxvn".ToCharArray()
    For Each ch In allChars
        values.Add(ch.ToString())
    Next

    For i As Integer = 1 To num_letters - 1

        Dim istr As String = ""
        Dim word As String = ""
        Do
            For Each str As String In values

                istr = str
                For Each ch In allChars
                    If ("kzrsdjlxvn".IndexOf(ch.ToString()) >= 0) = True Then
                        'CONSONANTS
                        word = ch.ToString
                    Else
                        'VOWEL
                        word = ch.ToString
                    End If
                Next
            Next

        Loop Until (istr.Length + word.Length) = num_letters

        new_values.Add(istr + word)

    Next
    values = new_values

    Return values
End Function

2 个答案:

答案 0 :(得分:1)

我重构了你的方法,让它更简单,更易读。

首先,我使用枚举来区分辅音和元音:

Enum LetterType
    Consonant = 0
    Vowel = 1
End Enum

我使用Random对象选择不同的字母并随机化,如果我从辅音或元音开始:

Private rnd As New Random()

主要功能。我添加了一个新参数numberOfNames,因为它在代码中丢失了。另外将返回类型更改为IEnumerable(Of String)以隐藏接口的实现。

Function getNames(numberOfLetters As Integer, numberOfNames As Integer) As IEnumerable(Of String)
    Dim names As New List(Of String)
    Dim letterByType As New Dictionary(Of LetterType, String) From {
                                        {LetterType.Vowel, "aeiou"},
                                        {LetterType.Consonant, "kzrsdjlxvn"}
                                      }

    For j As Integer = 0 To numberOfNames - 1
        Dim nextLetterType As LetterType = rnd.Next(0, 2) 'Start with either consonant (0) or vowel (1)
        Dim currentName As String = ""
        For i As Integer = 0 To numberOfLetters - 1
            currentName = String.Concat(currentName, getNextLetter(letterByType(nextLetterType)))
            nextLetterType = getNextLetterType(nextLetterType)
        Next
        names.Add(currentName)
    Next

    Return names
End Function

返回下一个随机辅音或元音:

Private Function getNextLetter(input As String) As Char
    Return input(rnd.Next(0, input.Length))
End Function

返回当前LetterType的反面,以避免“nno”,“ooz”,“zii”:

Private Function getNextLetterType(currentLetterType As LetterType) As LetterType
    Return currentLetterType Xor 1
End Function

使用

进行测试
 For Each name As String In getName(3, 5)
      Console.WriteLine(name)
 Next
 Console.ReadLine()

显示例如

vod
zaj
rov
sov
vol

编辑:小改进+拼写错误

答案 1 :(得分:1)

这不是你问题的直接答案,但我想我可能会尝试编写一个解决方案,它会产生所有可能的组合,而不是使用可能导致重复的随机值。

这是我的代码:

Function getName(num_letters As Integer) As List(Of String)

    Dim getAllSubsets As Func(Of IEnumerable(Of Char), IEnumerable(Of IEnumerable(Of Char))) = Nothing
    getAllSubsets = Function (xs) _
        If((xs Is Nothing OrElse Not xs.Any()), _
            Enumerable.Empty(Of IEnumerable(Of Char))(), _
            If(xs.Skip(1).Any(), _
                getAllSubsets(xs.Skip(1)).SelectMany(Function (ys) { ys, xs.Take(1).Concat(ys) }), _
                { Enumerable.Empty(Of Char)(), xs.Take(1) }))

    Dim consonants() As Char = "kzrsdjlxvn".ToCharArray()
    Dim vowels() As Char = "aeiouy".ToCharArray()

    Dim working_letters = (num_letters + num_letters Mod 2) \ 2

    Dim cSubsets = getAllSubsets(consonants).Where(Function (xs) xs.Count() = working_letters).ToArray()
    Dim vSubsets = getAllSubsets(vowels).Where(Function (xs) xs.Count() = working_letters).ToArray()

    Dim query = _
        From cs In cSubsets
        From vs In vSubsets
        From x In { String.Join("", cs.Zip(vs, Function (c, v) c & v)), String.Join("", vs.Zip(cs, Function (v, c) v & c)) }
        Order By x Ascending
        Select x.Substring(0, num_letters)

    Return query.Distinct().ToList()

End Function

getName(1)调用它我回复了这个:

  

a,d,e,i,j,k,l,n,o,r,s,u,v,x,y,z

getName(2)调用它我回复了这个:

  

ad,aj,ak,al,an,ar,as,av,ax,az,da,de,di,do,du,dy,ed,ej,ek,el,en,er,es,ev ,ex,ez,id,ij,ik,il,in,ir,is,iv,ix,iz,ja,je,ji,jo,ju,jy,ka,ke,ki,ko,ku,ky,la ,le,li,lo,lu,ly,na,ne,ni,no,nu,ny,od,oj,ok,ol,on,or,os,ov,ox,oz,ra,re,ri,ro ,ru,ry,sa,se,si,so,su,sy,ud,uj,uk,ul,un,ur,us,uv,ux,uz,va,ve,vi,vo,vu,vy,xa ,xe,xi,xo,xu,xy,yd,yj,yk,yl,yn,yr,ys,yv,yx,yz,za,ze,zi,zo,zu,zy

getName(3)调用它我回复了这个:

  

ade,adi,ado,adu,ady,aje,aji,ajo,aju,ajy,ake,aki,ako,aku,aky,ale,ali,alo,alu,aly,are,ari,aro,aru ,ary,ase,asi,aso,asu,asy,ave,avi,avo,avu,avy,ax,axi,axo,axu,axy,aze,azi,azo,azu,azy,daj,dal,dan,dav ,dax,dej,del,书房,开发,dex,dij,dil,din,div,dix,doj,dol,唐,dov,dox,duj,dul,dun,duv,dux,edi,edo,edu,edy ,eji,ejo,eju,ejy,eki,eko,eku,eky,eli,elo,elu,ely,eri,ero,eru,ery,esi,eso,esu,esy,evi,evo,evu,evy,exi exo,exu,exy,ezi,ezo,ezu,ezy,ido,idu,idy,ijo,iju,ijy,iko,iku,iky,ilo,ilu,ily,iro,iru,iry,iso,isu,isy ,ivo,ivu,ivy,ixo,ixu,ixy,izo,izu,izy,jal,jan,jav,jax,jel,jen,jv,jex,jil,jin,jiv,jix,jol,jon,jov,jox ,jul,jun,juv,jux,kad,kaj,kal,kan,kar,kas,kav,kax,kaz,ked,kej,kel,ken,ker,kes,kev,kex,kez,kid,kij,kil ,亲,kir,kis,kiv,kix,kiz,kod,ko,kol,kon,kor,kos,kov,kox,koz,kud,kuj,kul,kun,kur,kus,kuv,kux,kuz,lan ,拉v,lax,len,lev,lex,lin,liv,lix,lon,lov,lox,lun,luv,lux,odu,ody,oju,ojy,oku,oky,olu,oly,oru,ory,osu, osy,ovu,ovy,oxu,oxy,ozu,ozy,rad,raj,ral,ran,ras,rav,rax,red,rej,rel,ren,res,rev,rex,rid,rij,ril,rin, ris,riv,rix,rod,roj,rol,ron,ros,rov,rox,rud,ruj,rul,运行,rus,ruv,rux,悲伤,saj,sal,san,sav,sax,sed,sej, sel,森,sev,性别,sid,sij,sil,罪,siv,六,草皮,soj,sol,儿子,sov,sox,sud,suj,sul,sun,suv,sux,udy,ujy,uky, uly,ury,usy,uvy,uxy,uzy,van,ven,vin,von,van,xan,xav,xen,xev,xin,xiv,xon,xov,xun,xuv,zad,zaj,zal,zan, zar,zas,zav,zax,zed,zej,zel,zen,zer,zes,zev,zex,zid,zij,zil,zin,zir,zis,ziv,zix,zod,zoj,zol,zon,zor, zos,zov,zox,zud,zuj,zul,zun,zur,zus,zuv,zux

getName(4)调用它我回到这个缩写列表:

  

adej,adel,aden,adev,...,zury,zusy,zuvy,zuxy

最后,用getName(12)调用它我得到了这个缩写列表:

  

adejiloxuvyn,akedijoluvyn,akedijoluxyn,...,zasejiloxuvy,zasejixovuny,zaselixovuny