【发布时间】:2011-07-19 05:04:06
【问题描述】:
我正在尝试从此处的每个列表中获取一个项目,并将它们组合成一个唯一的名称。这只是为了踢球。 :)
以下是列表:
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();
}
【问题讨论】:
-
如果你开始排除对,它不再是随机的,不是吗?除非重复是一个明确的失败......如果没有绝对需要排除重复......让他们。
-
有必要不要让相同的排列存在。它们必须是唯一的名称。由于它是 12 x 12 x 12,我可以获得 1600 多个唯一名称,不是吗?除非我的数学是关闭的。
-
@sergio Tapia,这是正确的 1728 种独特的可能性。你打算生成所有这些吗?还是只有几个?
-
@MerickOWA:我决定只生成 500 个。如果我要生成所有内容,我可以一个一个迭代并获得所有这些。真的不是很好的运动。 :)