1

我正在开发一个 Windows 应用程序。这个应用程序包含一个动态的名称列表,以表格形式显示(用户可以添加或删除某个名称)。我想要做的是为 db 中的每个名称从列表中选择另一个随机名称。唯一的条件是应该为每个名称分配不同的名称,并且所有名称只能使用一次。

我试图做的是使用一个列表来包含数据库中的名称并从列表中选择一个随机索引并将其与数据库中的相应位置进行比较。如果它不同,则在该索引处删除,依此类推,直到没有更多名称可以放置。

但在那之后,我意识到这不是一个完美的方法。比方说,我有 5 个名字,

name 1 随机获取 name 3 name 2 随机获取 name 1 name 3 随机获取 name 4 name 4 随机获取 name 2 并且... name 5 只能获取 name 5,所以在这种情况下它不起作用。

任何人都知道我怎样才能使它工作?我应该使用什么其他方法?名字的数量大约是 20。稍后我将不得不为每个名字分配 2 个不同的名字。但首先我需要解决这个问题。

任何帮助将不胜感激!我正在用 C# 编写

4

5 回答 5

2

使用您建议的方法,并在遇到您描述的问题时交换最后两个元素。

于 2011-06-14T21:51:35.463 回答
2

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();
    }
于 2011-06-14T22:01:30.863 回答
0
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#。

好问题!

于 2011-06-14T22:04:01.997 回答
0

您可能想查看这个类似的问题或ruby​​ quiz 2的答案以获得想法。

一种基本的方法可能是复制列表,将副本随机排列,然后将两者对齐。但这可能会导致您遇到同样的问题。但是然后查看列表,您可以与每个自引用的列表进行交换。

于 2011-06-14T22:05:29.943 回答
0

我认为 shuffle one List<string> names,创建一个副本,将副本向下移动一个项目(使最后一个项目成为第一个)并按位置匹配名称会更简单。您确保一次没有重复。

于 2011-06-14T22:10:25.530 回答