我正在开发一个 Windows 应用程序。此应用程序包含动态名称列表,显示在表单中(用户可以添加或删除某个名称)。 我想要做的是为 db 中的每个名称从列表中选择另一个随机名称。唯一的条件是每个名称都应分配不同的名称,并且所有名称只能使用一次。
我尝试做的是使用一个列表来包含数据库中的名称并从列表中选择一个随机索引并将其与数据库中的相应位置进行比较。如果不同,则从该索引处删除,依此类推,直到没有更多名称可放置。
但在那之后我意识到这不是一个完美的方法。 比方说,我有 5 个名字,
名字 1 随机得到名字 3 姓名 2 随机获取姓名 1 名字 3 随机得到名字 4 名字 4 随机得到名字 2 和... name 5只能得到name 5,所以在这种情况下是行不通的。
任何人都知道我如何让它发挥作用?我应该使用什么其他方法? 名字的数量大约是 20。稍后我将不得不为每个名字分配 2 个不同的名字。 但首先我需要解决这个问题。
任何帮助将不胜感激! 我正在用 C# 编写
最佳答案
Jan 先于我,但这是我正在做的代码,用于解释如果未选择的名称匹配,您只需要切换最后两个。
static void Main(string[] args)
{
List<string> names = new List<string>() { "Jeff", "John", "Joe", "Jack", "Jim" };
List<string> otherNames = new List<string>() { "Jeff", "John", "Joe", "Jack", "Jim" };
Random r = new Random();
for (int i = 4; i >= 0; i--)
{
int pick1 = r.Next(i);
int pick2 = r.Next(i);
while (names[pick1] == otherNames[pick2])
{
pick2++;
if (pick2 >= otherNames.Count) pick2 = 0;
}
if (names.Count == 2)
{
// when you only have 2 names left, if the other names match...
if (names[1 - pick1] == otherNames[1 - pick2])
{
// swap one of the picked names
pick2 = 1 - pick2;
}
}
Console.Write(names[pick1]); Console.Write(" != "); Console.WriteLine(otherNames[pick2]);
names.RemoveAt(pick1);
otherNames.RemoveAt(pick2);
}
Console.ReadKey();
}
关于c# - 一种选择特定随机名称的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6350406/