如何解决选择特定随机名称的方法
| 我正在使用Windows应用程序。此应用程序包含一个动态名称列表,这些列表以表格形式显示(用户可以添加或删除某个名称)。 我想要做的是为数据库中的每个名称从列表中选择另一个随机名称。唯一的条件是,应为每个名称分配不同的名称,并且所有名称只能使用一次。 我试图做的是使用列表包含db中的名称,并从列表中选择一个随机索引,并将其与db中的相应位置进行比较。如果不同,则从该索引处删除,依此类推,直到不再放置其他名称为止。 但是在那之后,我意识到这不是一个完美的方法。 假设我有5个名字, 名字1随机获得名字3 名字2随机获得名字1 名字3随机获得名字4 名字4随机获得名字2 和... 名称5只能获取名称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\",\"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();
}
, 使用您建议的方法,遇到描述的问题时只需交换最后两个元素。
, while (position == 0) {
position = randInt() % nameCount;
}
for (int i=0;i<nameCount;i++) {
addPair(i,position);
position++;
if (position>=nameCount) position=0;
}
db中的名称在逻辑上从0到nameCount-1编号;
这个想法是,您为第二个名称选择随机位置,然后对其进行递增并在末尾滚动。
这是伪代码。我不懂C#。
好问题!
, 您可能想看看这个类似的问题,或者是ruby quiz 2的答案以获取一些想法。
一种基本的方法可能是复制列表,将副本随机排列,然后将两者对齐。但这最终可能会遇到与您同样的问题。但是,然后遍历列表,您可以与每个自引用列表交换。
, 我认为将一个List<string> names
打乱,创建副本,将副本下移一个项目(使最后一个项目成为第一个项目)并按位置匹配名称会更简单。您确保一次通过不重复。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。