C# 选择特定随机名称的方法
我正在开发一个windows应用程序。此应用程序包含一个动态名称列表,以用户可以添加或删除特定名称的形式显示。 我想做的是,对于db中的每个名称,从列表中选择另一个随机名称。唯一的条件是,对于每个名称,应指定不同的名称,并且所有名称只能使用一次 我尝试使用一个列表来包含数据库中的名称,并从列表中选择一个随机索引,将其与数据库中相应的位置进行比较。如果不同,则在该索引处删除,依此类推,直到没有更多的名称可放置 但在那之后,我意识到这不是一个完美的方法。 比如说,我有5个名字 名称1随机获取名称3 名称2随机获取名称1 name 3随机获取name 4 name 4随机获取name 2 和 name 5只能获取name 5,因此在本例中它不起作用 有人知道我该怎么做吗?我还应该用什么方法? 名字的数量大约是20个。稍后,我将不得不为每个名称指定两个不同的名称。 但首先我需要解决这个问题 任何帮助都将不胜感激!C# 选择特定随机名称的方法,c#,winforms,random,unique,random-sample,C#,Winforms,Random,Unique,Random Sample,我正在开发一个windows应用程序。此应用程序包含一个动态名称列表,以用户可以添加或删除特定名称的形式显示。 我想做的是,对于db中的每个名称,从列表中选择另一个随机名称。唯一的条件是,对于每个名称,应指定不同的名称,并且所有名称只能使用一次 我尝试使用一个列表来包含数据库中的名称,并从列表中选择一个随机索引,将其与数据库中相应的位置进行比较。如果不同,则在该索引处删除,依此类推,直到没有更多的名称可放置 但在那之后,我意识到这不是一个完美的方法。 比如说,我有5个名字 名称1随机获取名称3
我正在用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();
}
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();
}
db中的名称从0到nameCount-1进行逻辑编号;
其思想是,您为第二个名称选择随机位置,然后将其递增,并在末尾滚动
这是伪代码。我不知道C
好问题
db中的名称从0到nameCount-1进行逻辑编号;
其思想是,您为第二个名称选择随机位置,然后将其递增,并在末尾滚动
这是伪代码。我不知道C
好问题 您可能需要查看或找到问题的答案,以获取想法
一种基本的方法可能是复制列表,将副本洗牌,然后将两者对齐。但最终可能会出现与您相同的问题。但是,请仔细查看您可以与每个自引用列表交换的列表。您可能希望查看或找到答案以获取想法
一种基本的方法可能是复制列表,将副本洗牌,然后将两者对齐。但最终可能会出现与您相同的问题。但是,请仔细查看您可以与每个自引用列表交换的列表。我认为,将一个列表名称洗牌,创建一个副本,将副本向下移动一个项目,使最后一个项目成为第一个项目,并按位置匹配名称会更简单。您可以确保在一次传递中没有重复项。我认为,将一个列表名称洗牌,创建一个副本,将副本向下移动一个项目,使最后一个项目成为第一个项目,并按位置匹配名称会更简单。您可以确保在一次传递中没有重复项。如果您检查了数据库中的countNames,该怎么办。如果countNames%2==0,则运行匹配的函数名称/2次,否则运行匹配的函数名称/2-1次。也许您可以返回并检查重复的名称5=name 5的实例,然后随机将名称5的名称与另一个名称的名称交换。然后检查该名称是否重复并重复,直到不再重复为止?为什么结果是错误的?如果您真的想要分配随机名称,您有时会得到相同的名称。如果您检查了数据库中的countNames呢。如果countNames%2==0,则运行匹配的函数名称/2次,否则运行匹配的函数名称/2-1次。也许您可以返回并检查重复的名称5=name 5的实例,然后随机将名称5的名称与另一个名称的名称交换。然后检查该名称是否重复并重复,直到不再重复为止?为什么结果是错误的?如果你真的想分配一个随机的名字,你有时会得到相同的名字。是的,这样做似乎很容易,但我会在列表上有大约20个名字。如果我遇到更多这样的问题呢?如果你选择了一个重复的名字,只需选择另一个随机的名字,直到它是另一个。如果最后一个是重复的,只需将其与倒数第二个交换…是的,这样做似乎很容易,但我会在列表上有大约20个名字。如果我遇到更多这样的问题呢?如果你选择了一个重复的名字,只需选择另一个随机的名字,直到它是另一个。如果最后一个是重复的,只需将其与倒数第二个进行交换…感谢您对其进行编码。我正在使用手机浏览器:+1感谢您为我编写代码。我使用的是手机浏览器:+1