65.9K
CodeProject 正在变化。 阅读更多。
Home

创建昵称生成器

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.89/5 (12投票s)

2007年8月20日

CPOL

3分钟阅读

viewsIcon

57797

downloadIcon

806

昵称生成器

Screenshot - nickgen-screen.png

引言

在本文中,我将指导您创建一个昵称生成器,该生成器允许用户生成任意长度的昵称。 它还将提供在 Google 上查找生成的昵称以查看它是否有任何 Google 搜索结果的可能性。 如果昵称有 0 个结果,它应该是唯一的。

我们经常在留言板和各种网站上注册自己,但我们并不总是想使用我们的真实姓名或“官方”昵称。 有时需要一个无法追溯到我们的独特昵称。 这样做的原因有很多 - 要么进行一些卧底工作,要么匿名讨论一些私人事务。 这是昵称生成器派上用场的情况。

生成昵称的最简单方法似乎是生成一个随机字符串。 但结果看起来像 tmxoitrdyariqefoauhuatyni - 不太好。 它看起来确实像一堆随机字符,可能很难记住。

生成昵称的好方法可能是交替使用元音和辅音,这样我们将获得 ZobonaOsavirEcumolObunu 等结果。

实现

昵称生成将被封装在一个具有以下类图的类中

该类将包含所有可用元音和辅音的数组

char[] vowels = new char[] { 'a', 'e', 'i', 'o', 'u', 'y' }; 
char[] consonants = new char[] { 'b', 'c', 'd', 'f', 'g', 'h', 'j', 'k', 
    'l', 'm', 'n', 'p', 'q', 'r', 's', 't', 'v', 'w', 'x', 'z' }; 

NickGenerator 的构造函数初始化随机数生成器。

该类包含一个 public 方法 Generate(int length),该方法返回一个 string ,其中包含提供的长度的生成的昵称。

public string Generate(int length)
{
    StringBuilder sb = new StringBuilder();
    //initialize our vowel/consonant flag
    bool flag = (random.Next(2) == 0);
    for (int i = 0; i < length; i++)
    {
        sb.Append(GetChar(flag));
        flag = !flag; //invert the vowel/consonant flag
    }
    return sb.ToString();
}

它首先确定起始字符是元音还是辅音,然后在循环中将其他元音和辅音(轮流)添加到结果中。

获取随机字符的方法如下

private char GetChar(bool vowel)
{
    if (vowel)
    {
        return vowels[random.Next(vowels.Length)];
    }
    return consonants[random.Next(consonants.Length)];
}

最后一步是检查生成的昵称是否唯一。 该类为此目的提供了一个方法 GetWebResultsForNickname。 该方法具有以下主体

public static int GetWebResultsForNickname(string text)
{
    string address = http://www.google.com/xhtml/search?mrestrict=xhtml&hl=en&q= 
                + text;
    WebClient client = new WebClient();
    client.Encoding = Encoding.UTF8;
    string input = client.DownloadString(address);
    //regex 
    Match match = new Regex
        ("Results [0-9] - [0-9]+ of .*?([0-9|,]+)\\.").Match(input);
    if (match.Success)
    {
        return int.Parse(match.Groups[1].Value.Replace(",", ""));
    }
    return 0;
}

该方法连接到 Google 的服务器并检索我们的昵称的结果页面。 然后我们使用正则表达式 "Results [0-9] - [0-9]+ of .*?([0-9|,]+)\\." 检查结果数。 它们以两种形式显示:Results 0 - 3 of 3Results 0 - 10 of about 123,456。 结果数具有千位分隔符“,” - 我们在数字解析中处理它。 解析该格式数字的另一种方法是使用 NumberFormatInfo 类。

为了简单起见,该代码不是用户友好的,可能会在异常情况下崩溃(例如,昵称的负长度)。

演示程序

演示程序由一个简单的 Windows 窗体组成,它使用这个类来生成昵称。 结果的长度可以从 NumericUpDown 控件中选择。

进一步的步骤

您可以尝试改进此昵称生成器以产生更真实的结果。 肯定有改进的余地,因为在人类语言中,某些字符倾向于与某些其他字符分组在一起更频繁,而某些分组几乎从不发生(例如 yqi 等)。 此外,某些字符不太可能成为生成的昵称的第一个字符(对我来说,大多数以 q 和 y 开头的结果听起来很奇怪)。

我认为您可以通过向生成昵称的方法添加一些额外的逻辑来轻松增强结果 - 比如为每个字符添加一些因素,这些因素将指定它出现的可能性,以及由此产生的单词以它开头或结尾的可能性。

进一步的改进 - 使结果看起来像人类语言单词 - 可能需要语言学知识,不幸的是我不是专家。

历史

  • 2007 年 8 月 19 日:首次发布
© . All rights reserved.