【问题标题】:First Name Generator not working名字生成器不工作
【发布时间】:2014-12-04 04:25:36
【问题描述】:

我试图制作一个随机名称生成器,这是我想出的代码:

 private void GenerateName()
    {
        if (GeneratedName == "")
        {
            GenerateConsonant();
            consonantCurrent = consonant1;
            GenerateVowel();
            vowelCurrent = vowel1;
            GenerateConsonant();
            consonantCurrent = consonant2;
            GenerateConsonant();
            consonantCurrent = consonant3;
            GenerateVowel();
            vowelCurrent = vowel2;
        }

        GeneratedName = consonant1 + vowel1 + consonant2 + consonant3 + vowel2;
    }

    private void GenerateConsonant()
    {
        Random randomNumber = new Random();
        GlobalVariables.random = randomNumber.Next(2, 22);

        if (GlobalVariables.random == 1)
        {
            consonantCurrent = "b";
        }
        if (GlobalVariables.random == 2)
        {
            consonantCurrent = "c";
        }
        if (GlobalVariables.random == 3)
        {
            consonantCurrent = "d";
        }
        if (GlobalVariables.random == 4)
        {
            consonantCurrent = "f";
        }
        if (GlobalVariables.random == 5)
        {
            consonantCurrent = "g";
        }
        if (GlobalVariables.random == 6)
        {
            consonantCurrent = "h";
        }
        if (GlobalVariables.random == 7)
        {
            consonantCurrent = "j";
        }
        if (GlobalVariables.random == 8)
        {
            consonantCurrent = "k";
        }
        if (GlobalVariables.random == 9)
        {
            consonantCurrent = "l";
        }
        if (GlobalVariables.random == 10)
        {
            consonantCurrent = "m";
        }
        if (GlobalVariables.random == 11)
        {
            consonantCurrent = "n";
        }
        if (GlobalVariables.random == 12)
        {
            consonantCurrent = "p";
        }
        if (GlobalVariables.random == 13)
        {
            consonantCurrent = "q";
        }
        if (GlobalVariables.random == 14)
        {
            consonantCurrent = "r";
        }
        if (GlobalVariables.random == 15)
        {
            consonantCurrent = "s";
        }
        if (GlobalVariables.random == 16)
        {
            consonantCurrent = "t";
        }
        if (GlobalVariables.random == 17)
        {
            consonantCurrent = "v";
        }
        if (GlobalVariables.random == 18)
        {
            consonantCurrent = "w";
        }
        if (GlobalVariables.random == 19)
        {
            consonantCurrent = "x";
        }
        if (GlobalVariables.random == 20)
        {
            consonantCurrent = "y";
        }
        if (GlobalVariables.random == 21)
        {
            consonantCurrent = "z";
        }
    }

    private void GenerateVowel()
    {
        Random randomNumber = new Random();
        GlobalVariables.random = randomNumber.Next(2, 6);

        if (GlobalVariables.random == 1)
        {
            vowelCurrent = "a";
        }
        if (GlobalVariables.random == 2)
        {
            vowelCurrent = "e";
        }
        if (GlobalVariables.random == 3)
        {
            vowelCurrent = "i";
        }
        if (GlobalVariables.random == 4)
        {
            vowelCurrent = "o";
        }
        if (GlobalVariables.random == 5)
        {
            vowelCurrent = "u";
        }
    }
}

}

运行后,我发现它给了我一个空结果...... 如果有明显的错误,请告诉我,因为我是智障:l 或者,如果它永远行不通,您可以向我展示一种方法,然后我会尝试使其适应我的程序。

顺便说一句,我正在制作一个大战略游戏,它会使用它来为角色生成随机名称

编辑: 我试图做的是每次调用 GenerateConsonant() 和 GenerateVowel() 时,它们都会将随机字符设置为 Current 值。然后在每个设置后,它将自己设置为某个辅音或元音。在此之后,它们将被放在一起形成一个名字......

【问题讨论】:

  • 对于初学者,您在第一个 if 语句中的变量分配是向后的。
  • consonantCurrent = consonant1; 是倒退的。您将 consonant1 分配给 consonantCurrent。为了让 GeneratedName 实际上有一个值,您需要反过来使用它。
  • 谢谢,我会测试一下...我太笨了!
  • 一个问题是每次调用GenerateConsonant 时都会创建一个新的Random 实例。你应该在类范围内创建一次Random 实例(即private readonly Random RandomNumber = new Random(); 否则你会得到很多重复的辅音。
  • GenerateConsonant()GenerateVowel() 方法没有返回辅音和元音的任何特殊原因?

标签: c# random


【解决方案1】:

Logarr 表示没有

consonantCurrent = consonant1;

你应该有

consonant1 = consonantCurrent;

您的其他变量分配也是如此。

此外,我建议在随机函数中返回辅音或元音,而不是将其分配给 consonantCurrentvowelCurrent。它为您节省了一个变量,并且减少了混乱。

我不确定这些是否属于更大的类,但请确保在为它们赋值之前初始化 consonant1 等变量。

【讨论】:

    【解决方案2】:

    这么少的代码中有很多错误:

    • Random 的每个随机数的新实例
    • 随机数生成范围不正确
    • 反向分配
    • 不使用y 作为元音?

    不要介意使用副作用(类字段)而不是仅仅从方法返回值,以及使用大量 if 语句(甚至不是 if/else if!)来映射整数转字符。

    在我看来,这样的东西写起来会容易得多,以后也会更容易阅读:

        static readonly string[] _vowels = { "a", "e", "i", "o", "u" };
        static readonly string[] _consonants =
            Enumerable.Range((int)'b', (int)'z' - (int)'b' + 1)
                      .Select(c => ((char)c).ToString())
                      .Except(_vowels)
                      .ToArray();
    
        static readonly Random _random = new Random();
    
        private static string GenerateName()
        {
            return GenerateConsonant()
                + GenerateVowel()
                + GenerateConsonant()
                + GenerateConsonant()
                + GenerateVowel();
        }
    
        private static string GenerateVowel()
        {
            return _vowels[_random.Next(_vowels.Length)];
        }
    
        private static string GenerateConsonant()
        {
            return _consonants[_random.Next(_consonants.Length)];
        }
    

    我将由您决定是否将“y”算作元音和辅音,如果是,如何实现。 :)

    【讨论】:

      【解决方案3】:

      您的所有代码都可以用一个简单的方法生成随机名称

      在班级级别分配随机班级

      Random rnd = new Random();
      
      private string Generate_Name(int length)
          {
      
              string name = "";
      
              string[] letters = new string[21] { "b", "c", "d",
                                                      "f", "g", "h", "j",
                                                      "k", "l", "m", "n",
                                                      "p", "q", "r", "s", "t",
                                                      "v", "w", "x", "y", "z"};
      
              string[] vowels = new string[5] { "a", "e", "i", "o", "u" };
      
              for (int i = 0; i < length; i++)
              {
                  if (i == 2 || i == 4)
                  {
                      int index = rnd.Next(0, vowels.Length);
                      name += vowels[index];
                  }
                  else
                  {
                      int index = rnd.Next(0, letters.Length);
                      name += letters[index];
                  }
              }
      
              return name;
      
          }
      

      然后您可以更改代码以适应您的需要!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-28
        • 2015-03-23
        • 2013-07-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多