Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 选择特定随机名称的方法_C#_Winforms_Random_Unique_Random Sample - Fatal编程技术网

C# 选择特定随机名称的方法

C# 选择特定随机名称的方法,c#,winforms,random,unique,random-sample,C#,Winforms,Random,Unique,Random Sample,我正在开发一个windows应用程序。此应用程序包含一个动态名称列表,以用户可以添加或删除特定名称的形式显示。 我想做的是,对于db中的每个名称,从列表中选择另一个随机名称。唯一的条件是,对于每个名称,应指定不同的名称,并且所有名称只能使用一次 我尝试使用一个列表来包含数据库中的名称,并从列表中选择一个随机索引,将其与数据库中相应的位置进行比较。如果不同,则在该索引处删除,依此类推,直到没有更多的名称可放置 但在那之后,我意识到这不是一个完美的方法。 比如说,我有5个名字 名称1随机获取名称3

我正在开发一个windows应用程序。此应用程序包含一个动态名称列表,以用户可以添加或删除特定名称的形式显示。 我想做的是,对于db中的每个名称,从列表中选择另一个随机名称。唯一的条件是,对于每个名称,应指定不同的名称,并且所有名称只能使用一次

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

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

名称1随机获取名称3 名称2随机获取名称1 name 3随机获取name 4 name 4随机获取name 2 和 name 5只能获取name 5,因此在本例中它不起作用

有人知道我该怎么做吗?我还应该用什么方法? 名字的数量大约是20个。稍后,我将不得不为每个名称指定两个不同的名称。 但首先我需要解决这个问题

任何帮助都将不胜感激!
我正在用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