创建随机名称生成器。我该如何做到这一点?

时间:2011-03-20 17:17:02

标签: c# list random tuples

我正在尝试从这里的每个列表中抓取一个项目,并将它们组合起来以创建一个唯一的名称。这只是为了踢。 :)

以下是清单:

List<string> FirstNames = new List<string>()
{
    "Sergio",
    "Daniel",
    "Carolina",
    "David",
    "Reina",
    "Saul",
    "Bernard",
    "Danny",
    "Dimas",
    "Yuri",
    "Ivan",
    "Laura"
};

List<string> LastNamesA = new List<string>()
{
    "Tapia",
    "Gutierrez",
    "Rueda",
    "Galviz",
    "Yuli",
    "Rivera",
    "Mamami",
    "Saucedo",
    "Dominguez",
    "Escobar",
    "Martin",
    "Crespo"
};

List<string> LastNamesB = new List<string>()
{
    "Johnson",
    "Williams",
    "Jones",
    "Brown",
    "David",
    "Miller",
    "Wilson",
    "Anderson",
    "Thomas",
    "Jackson",
    "White",
    "Robinson"
};

我知道我通过索引获得了一个项目,而且我也知道我可以使用Random类生成一个从0到ListFoo.Count的随机数。

我不知道的是如何检查是否已从集合中抽取随机排列。

我考虑过使用元组类:

List<Tuple<int,int,int>> permutations = new List<Tuple<int,int,int>>();

但我在这里有一个脑筋。 ;)任何指导?我不是真的在寻找这个简单问题的完整代码,只是一个建议或提示。


修改

感谢这里给出的建议,这里是我想出来的。还有改进空间吗?

static void Main(string[] args)
{
    List<string> FirstNames = new List<string>()
    {
        "Sergio",
        "Daniel",
        "Carolina",
        "David",
        "Reina",
        "Saul",
        "Bernard",
        "Danny",
        "Dimas",
        "Yuri",
        "Ivan",
        "Laura"
    };

    List<string> LastNamesA = new List<string>()
    {
        "Tapia",
        "Gutierrez",
        "Rueda",
        "Galviz",
        "Yuli",
        "Rivera",
        "Mamami",
        "Saucedo",
        "Dominguez",
        "Escobar",
        "Martin",
        "Crespo"
    };

    List<string> LastNamesB = new List<string>()
    {
        "Johnson",
        "Williams",
        "Jones",
        "Brown",
        "David",
        "Miller",
        "Wilson",
        "Anderson",
        "Thomas",
        "Jackson",
        "White",
        "Robinson"
    };

    var permutations = new List<Tuple<int, int, int>>();
    List<string> generatedNames = new List<string>();

    Random random = new Random();
    int a, b, c;

    //We want to generate 500 names.
    while (permutations.Count < 500)
    {
        a = random.Next(0, FirstNames.Count);
        b = random.Next(0, FirstNames.Count);
        c = random.Next(0, FirstNames.Count);

        Tuple<int, int, int> tuple = new Tuple<int, int, int>(a, b, c);

        if (!permutations.Contains(tuple))
        {
            permutations.Add(tuple);
        }
    }

    foreach (var tuple in permutations)
    {
        generatedNames.Add(string.Format("{0} {1} {2}", FirstNames[tuple.Item1], 
                                                        LastNamesA[tuple.Item2],
                                                        LastNamesB[tuple.Item3])
        );
    }

    foreach (var n in generatedNames)
    {
        Console.WriteLine(n);
    }

    Console.ReadKey();
}

6 个答案:

答案 0 :(得分:4)

你走在正确的轨道上! 每次生成名称时,都将其添加到元组列表

//Create the tuple
Tuple <int, int, int> tuple = new Tuple<int, int, int>(index1, index2, index3)

if(!permutations.Contains(tuple))
{ 
    permutations.Add(tuple);
    //Do something else
}

答案 1 :(得分:2)

我认为最简单的解决方案是将组合的名称填充到HashSet<string>中,以确保创建的名称列表是唯一的。

答案 2 :(得分:1)

HashSet答案的另一种选择是提前构建所有可能的组合,将它们随机播放,然后将它们存储在队列中,您可以在队列中一次检索它们。这将避免每次构建新的时都检查现有的,并且仍然是随机的。

这只有在您没有大型集合时才有效,因为创建完整列表并对其进行混洗所涉及的工作对于大量数据来说将是巨大的。

答案 3 :(得分:1)

使用LINQ生成它们非常容易:

var combs =
(from first in FirstNames
from second in LastNamesA
from third in LastNamesB
select new Tuple<string, string, string>(first, second, third)).ToList();

在此之后,如果您需要随机从列表中获取唯一元素,只需将列表随机播放,然后按顺序逐个选择它们。

您可以使用Knuth-Fisher-Yates算法(这是就地随机播放):

Random rand = new Random();

for (int i = combs.Count - 1; i > 0; i--)
{
    int n = rand.Next(i + 1);
    var mem = combs[i];
    combs[i] = combs[n];
    combs[n] = mem;
}

答案 4 :(得分:0)

  1. 创建一个包含3个随机数字的新元组
  2. 检查排列是否包含新元组
  3. 如果不是=&gt;将新元组添加到列表中。如果是,请再次从第1点开始。

答案 5 :(得分:0)

我会创建一个HashSet<int>并存储选择的数字表示(例如135表示第一,第三和第五或使用010305),然后检查它们是否在集合中。