4

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

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

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

这是我到目前为止的代码:

  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)];
        }

  }

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

4

7 回答 7

15
    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;


     }
于 2018-04-19T13:37:42.263 回答
8

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

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

喜欢:

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

private void RandName()
{
   ...
}
于 2013-02-04T13:29:33.697 回答
5

好的,在不知道您面临的问题的情况下,这有点像在黑暗中刺伤,但我认为您的问题是您已将数组大小声明为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"};
于 2013-02-04T13:26:14.283 回答
2

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

除此之外,你永远不会到达else这里的街区

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

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

if (rand.Next(0, 2) == 1)
于 2013-02-04T13:29:13.883 回答
0

我认为你应该看看AutoPoco

如何使用它的一个例子。

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

于 2013-02-04T13:59:20.683 回答
0

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

    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 打开单独的文件并将每一行读入三个列表。这就是我会做的方式。

于 2013-05-28T22:37:09.573 回答
0
    public string GenerateToken(Byte length) {
        var bytes = new byte[length];
        var rnd = new Random();
        rnd.NextBytes(bytes);
        return Convert.ToBase64String(bytes).Replace("=", "").Replace("+", "").Replace("/", "");
    }

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

于 2015-06-11T14:03:39.157 回答