【问题标题】:Random name generator in c#c#中的随机名称生成器
【发布时间】:2013-01-19 04:57:44
【问题描述】:

我有一个女性和男性名字的列表,然后是数组中的姓氏列表。

我试图做的是使用随机生成器在这些数组中获取这些名称,并根据我的调用输出一个随机的名字和姓氏。

完成后,我将在其他类中引用该方法,而不必每次都将其写出来。

这是我目前的代码:

  private void RandName()
  {
        string[] maleNames = new string[1000] { "aaron", "abdul", "abe", "abel", "abraham", "adam", "adan", "adolfo", "adolph", "adrian"};
        string[] femaleNames = new string[1000] { "abby", "abigail", "adele", "adrian"};
        string[] lastNames = new string[1000] { "abbott", "acosta", "adams", "adkins", "aguilar"};

        Random rand = new Random(DateTime.Now.Second);
        if (rand.Next(1, 2) == 1)
        {
            FirstName = maleNames[rand.Next(0, maleNames.Length - 1)];
        }
        else
        {
            FirstName = femaleNames[rand.Next(0, femaleNames.Length - 1)];
        }

  }

我的问题是:如何使用我创建的名称数组创建随机名称生成器?

【问题讨论】:

  • 有什么问题?
  • 抱歉,如何使用我创建的名称数组创建随机名称生成器。
  • @Dev24Amaya 请解释为什么您得到的输出与您期望的输出不匹配。我在下面做了一个猜测,但这只是一个猜测!
  • 一秒钟内调用该方法两次不会太随意
  • 您可能希望将您的rand 声明为私有静态变量;如果用户点击生成随机名称的速度超过 1 秒,则会生成相同的名称。此外,无需手动指定种子即可。

标签: c# random names


【解决方案1】:
    public static string GenerateName(int len)
    { 
        Random r = new Random();
        string[] consonants = { "b", "c", "d", "f", "g", "h", "j", "k", "l", "m", "l", "n", "p", "q", "r", "s", "sh", "zh", "t", "v", "w", "x" };
        string[] vowels = { "a", "e", "i", "o", "u", "ae", "y" };
        string Name = "";
        Name += consonants[r.Next(consonants.Length)].ToUpper();
        Name += vowels[r.Next(vowels.Length)];
        int b = 2; //b tells how many times a new letter has been added. It's 2 right now because the first two letters are already in the name.
        while (b < len)
        {
            Name += consonants[r.Next(consonants.Length)];
            b++;
            Name += vowels[r.Next(vowels.Length)];
            b++;
        }

        return Name;


     }

【讨论】:

  • 希望这段代码对你有帮助。这段代码会生成一个随机名称。
  • 错误 CS1061:类型 UnityEngine.Random' does not contain a definition for Next' 并且找不到扩展方法 Next' of type UnityEngine.Random'。您是否缺少程序集参考?
  • @WaqarKhan 指的是System.Random@SumitPal
  • 这没有回答 OP 的问题:“如何创建随机名称生成器 使用我创建的名称数组?”,但是相反,创建一个由交替的辅音和元音组成的随机字符串。
【解决方案2】:

我猜你的随机生成器的结果每次都是一样的..

如果这是你的问题,你不应该每次都创建局部变量rand。改为创建字段。

像这样的:

private static Random rand = new Random(DateTime.Now.Second);

private void RandName()
{
   ...
}

【讨论】:

  • 我会注意一个静态的Random,这个类不是线程安全的,最好不要让它成为静态的(我也不会用DateTime.Now.Second播种它,只使用默认构造函数,内部使用Environment.TickCount)
  • @ScottChamberlain 你能解释一下随机类是如何处理种子的吗?我对该主题的有限知识表明构造函数采用任意数字并使用它,这意味着new Random(DateTime.Now.Second) 不应每次都返回相同的数字,尽管情况似乎并非如此。种子是如何使用的?
【解决方案3】:

好的,在不知道您面临的问题的情况下,这有点像在黑暗中刺伤,但我认为您的问题是您已将数组大小声明为1000,但仅在其中输入了大约 10 个值每一个。因此,您的数组只有 1% 已满,因此您将获得的大多是空名称。

尝试以下方法:

// Note I have not specified the array size.
string[] maleNames   = {"aaron", "abdul", "abe", "abel", "abraham", "adam", "adan", "adolfo", "adolph", "adrian"};
string[] femaleNames = {"abby", "abigail", "adele", "adrian"};
string[] lastNames   = {"abbott", "acosta", "adams", "adkins", "aguilar"};

【讨论】:

  • 值得注意的是 RB 在这里实际做了什么——通过删除字符串数组的 1000 的约束,数组的大小由 {} 中提供的元素数量决定,然后数组动态已定义。
  • @RB,我没有输入所有 1000 个值,因为在帖子中包含太多,但在代码中有这个数量。
  • @Dev24Amaya 正如我所说 - 这是一个猜测,因为你还没有解释你所面临的问题!
  • 对不起!我在从我创建的名称数组中获取随机名称时遇到问题。我现在正在根据以下答案进行一些调整。
【解决方案4】:

由于随机实例是在RandName 中创建的,因此当方法被快速调用时(例如在循环中),您将创建相同的名称。您应该使用一个字段或将随机数作为参数传递给该方法。

除此之外,您将永远无法到达此处的else 块

if (rand.Next(1, 2) == 1)

因为Random.Next 的第二个参数是唯一的上限,它总是生成 1。所以你可能想要这个代替:

if (rand.Next(0, 2) == 1)

【讨论】:

    【解决方案5】:

    我觉得你应该看看AutoPoco。

    One example 了解如何使用它。

    如果您将deeper look 放入文档中,您会发现已经存在的名字和姓氏数据源(可以使用、放大或替换)。

    【讨论】:

      【解决方案6】:

      像这样格式化你的字符串...

          string[] maleNames = new string[] { "aaron", "abdul", "abe", "abel", "abraham", "adam", "adan", "adolfo", "adolph", "adrian"};
          string[] femaleNames = new string[] { "abby", "abigail", "adele", "adrian"};
          string[] lastNames = new string[] { "abbott", "acosta", "adams", "adkins", "aguilar"};
      

      或者对我来说更简单的方法是使用列表。我用它们来遍历文件。主要区别在于您必须使用 List.Add() 一次添加一个,并且它使用 List.Count 而不是 Array.Length。 List 还允许您修改条目而无需调整数组的大小。在您的情况下,您尝试创建的列表如下所示

      List<string> maleNames = new List<string>();
      List<string> femaleNames = new List<string>();
      List<string> lastNames = new List<string>();
      

      然后使用 System.IO 打开单独的文件并将每一行读入三个列表。我就是这样做的。

      【讨论】:

        【解决方案7】:
            public string GenerateToken(Byte length) {
                var bytes = new byte[length];
                var rnd = new Random();
                rnd.NextBytes(bytes);
                return Convert.ToBase64String(bytes).Replace("=", "").Replace("+", "").Replace("/", "");
            }
        

        是一个非常简单的生成器..

        【讨论】:

          猜你喜欢
          • 2021-12-18
          • 2020-10-16
          • 1970-01-01
          • 2014-10-16
          • 2011-08-13
          • 2022-08-11
          • 2021-09-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多