改组竞争对手名单,每个月都有不同的竞争对手

时间:2018-12-18 07:52:49

标签: c# random shuffle

对于我的朋友体育比赛,每个玩家每个月必须与另一名玩家进行一场比赛。现在,如果我有20位左右的玩家列表,那么第一个月的随机化就不那么困难了,所以我有10场比赛。

在那之后的所有几个月中,尽管我不确定如何使随机发生器工作,所以它们不会与所打过的球员相匹配。

现在我用Players(Name,(int)Id,Email),Matches(Id,Player1ID,Player2ID)创建了一个sql数据库

我正在考虑将列表随机化,并检查每个匹配项是否不包含数据库中某个匹配项的2个ID。如果匹配1次,则重新执行该月的整个随机操作。

但是我不确定那是否是最好的方法。

这是我到目前为止的结果,在向数据库添加一些“分类帐”和“匹配项”后,我还没有进行测试。

    private void MaakMatchen(Maand maand)
    {
        List<Lid> leden = new List<Lid>();
        var dbManager = new Manager();
        using (var conGildenhof = dbManager.GetConnection())
        {
            using (var comLeden = conGildenhof.CreateCommand())
            {
                comLeden.CommandType = CommandType.Text;
                comLeden.CommandText = "select * from dbo.Leden";
                conGildenhof.Open();
                using (var alleleden = comLeden.ExecuteReader())
                {
                    Int32 voornaamPos = alleleden.GetOrdinal("Voornaam");
                    Int32 familienaamPos = alleleden.GetOrdinal("Familienaam");
                    Int32 LidNummerPos = alleleden.GetOrdinal("LidNummer");

                    while (alleleden.Read())
                    {
                        leden.Add(new Classes.Lid(alleleden.GetString(voornaamPos), alleleden.GetString(familienaamPos), alleleden.GetInt32(LidNummerPos)));
                    }
                    leden = Randomize(leden);
                }
            }

            using (var comInsert = conGildenhof.CreateCommand())
            {
                comInsert.CommandType = CommandType.Text;
                comInsert.CommandText = "Insert into dbo.Matches (Lid1Id, Lid2Id, Maand) values (@lid1, @lid2, @maand)";

                var parLid1 = comInsert.CreateParameter();
                parLid1.ParameterName = "@lid1";
                comInsert.Parameters.Add(parLid1);

                var parLid2 = comInsert.CreateParameter();
                parLid2.ParameterName = "@lid2";
                comInsert.Parameters.Add(parLid2);

                var parMaand = comInsert.CreateParameter();
                parMaand.ParameterName = "@maand";
                comInsert.Parameters.Add(parMaand);


                int lengte = leden.Count();
                for (int i = 0; i < lengte; i = i + 2)
                {
                    parLid1.Value = leden[i].LidNummer;
                    parLid2.Value = leden[i + 1].LidNummer;
                    parMaand.Value = (int)maand;

                    comInsert.ExecuteNonQuery();
                }
            }
        }
    }

    private List<Lid> Randomize(List<Lid> leden)
    {
        for (int i=0;i<100;i++)
        {
            leden = Shuffle(leden);
        }
        int temp = CheckUp(leden);
        while (temp != 100)
        {
            leden = Shuffle(leden, temp);
            temp = CheckUp(leden);
        }
        return leden;
    }

    private List<Lid> Shuffle(List<Lid> leden)
    {
        Random rnd = new Random();
        int a = rnd.Next(1, leden.Count() + 1);
        int b = rnd.Next(1, leden.Count() + 1);

        var temp = new Lid();
        temp = leden[a];
        leden[a] = leden[b];
        leden[b] = temp;

        return leden;
    }

    private List<Lid> Shuffle(List<Lid> leden, int id)
    {
        Random rnd = new Random();
        int a = rnd.Next(1, leden.Count() + 1);
        int b = id;

        var temp = new Lid();
        temp = leden[a];
        leden[a] = leden[b];
        leden[b] = temp;

        return leden;
    }

    private int CheckUp(List<Lid> leden)
    {
        int lengte = leden.Count();
        List<Matches> matches = new List<Matches>();
        var dbManager = new Manager();
        using (var conGildenhof = dbManager.GetConnection())
        {
            using (var comMatches = conGildenhof.CreateCommand())
            {
                comMatches.CommandType = CommandType.Text;
                comMatches.CommandText = "select * from dbo.Matches";
                conGildenhof.Open();
                using (var allematches = comMatches.ExecuteReader())
                {
                    Int32 lid1Pos = allematches.GetOrdinal("Lid1Id");
                    Int32 lid2Pos = allematches.GetOrdinal("Lid2Id");
                    Int32 maandPos = allematches.GetOrdinal("Maand");

                    while (allematches.Read())
                    {
                        matches.Add(new Classes.Matches(allematches.GetInt32(lid1Pos), allematches.GetInt32(lid2Pos), (Maand)allematches.GetInt32(maandPos)));
                    }
                }
            }
        }
        for (int i=0;i<lengte;i=i+2)
        {
            foreach (Matches match in matches)
            {
                if (leden[i].LidNummer == match.Lid1Id)
                {
                    if (leden[i + 1].LidNummer == match.Lid2Id)
                        return leden[i].LidNummer;
                }
                if (leden[i].LidNummer == match.Lid2Id)
                {
                    if (leden[i + 1].LidNummer == match.Lid1Id)
                        return leden[i].LidNummer;
                }
            }
        }
        return 100;
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        var maand = new int();
        int.TryParse(TextBoxMaand.Text, out maand);
        if (maand == 0)
            TextBoxMaand.Text = "GETAL!";
        else
        {
            MaakMatchen((Maand)maand);
        }
    }

1 个答案:

答案 0 :(得分:0)

我会先洗牌并在第二次迭代中创建比赛

List<Player> players = GetPlayers();
Random _rnd = new Random();
// shuffle players
players = players.OrderBy(_ => _rnd.Next()).ToList();
// create matches
var matches = players.Take(players.Count / 2).Zip(players.Skip(players.Count / 2), (p1, p2) => new Match(p1,p2));

https://dotnetfiddle.net/sGxbx4