求随机抽签代码

boy521 2018-03-07 11:27:38
WINFORM开发界面下,现有AB、BC、CD、DE、EF、FG六支队伍抽签,要求进行随机抽签。
抽签要求:1、每个队伍抽签时,随机抽中另外两支队伍。
2、抽签时应排除当前队伍,如AB抽签时,只能对BC、CD、DE、EF、FG进行抽签。
3、每个队伍每抽中总数不能大于2次,如AB抽中BC、CD、BC抽中CD、DE,剩下队伍抽签时应排除CD。
4、两支队伍不能同时即为抽签又为被抽签队伍,即AB抽中BC、CD,BC抽签时应排除AB。
...全文
1195 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuzuning 2018-03-22
  • 打赏
  • 举报
回复
算法没有错,但由于你的规则限制,出现个别队伍轮空的情况是正常的 如果你不允许这种情况出现,那就在出现时再重新抽,知道满足要求
boy521 2018-03-22
  • 打赏
  • 举报
回复
引用 15 楼 xuzuning 的回复:
算法没有错,但由于你的规则限制,出现个别队伍轮空的情况是正常的 如果你不允许这种情况出现,那就在出现时再重新抽,知道满足要求
规则这样的,如何规避轮空队伍?
boy521 2018-03-21
  • 打赏
  • 举报
回复
引用 5 楼 starfd 的回复:
Console.WriteLine 不懂控制台输出么……
前面写错了,这个算法存在问题,随机抽签结果会出现: A->D E B->E F C->D F D->B C 那么:E抽签时不可以抽A、B,D、F已被抽两次,只剩C可以被抽,无法抽出两支队伍,算法即有问题了!
boy521 2018-03-21
  • 打赏
  • 举报
回复
引用 10 楼 xu2531509 的回复:
楼主基础不扎实啊
这个算法存在问题,随机抽签结果会出现: AB ->CD DE BC->CD DE CD->AB BC DE->AB BC 那么:EF即无法抽出相应的队伍了!
boy521 2018-03-21
  • 打赏
  • 举报
回复
引用 5 楼 starfd 的回复:
Console.WriteLine 不懂控制台输出么……
这个算法存在问题,随机抽签结果会出现: AB ->CD DE BC->CD DE CD->AB BC DE->AB BC 那么:EF即无法抽出相应的队伍了!
weixin_41800531 2018-03-09
  • 打赏
  • 举报
回复
最后一支队伍应该不用抽签
boy521 2018-03-08
  • 打赏
  • 举报
回复
引用 7 楼 qq_17486399 的回复:
看你情况对C#编程不怎么了解啊,或者是完全的小白啊
求帮助
xu2531509 2018-03-08
  • 打赏
  • 举报
回复
楼主基础不扎实啊
大鱼> 2018-03-08
  • 打赏
  • 举报
回复
引用 8 楼 boy521 的回复:
引用 7 楼 qq_17486399 的回复:
看你情况对C#编程不怎么了解啊,或者是完全的小白啊
求帮助
楼上的都给你说的那么详细了,还要什么帮助啊
  • 打赏
  • 举报
回复
        static Dictionary<string, string[]> dic = new Dictionary<string, string[]>();
        static string[] teams = { "AB", "BC", "CD", "DE", "EF", "FG" };

        static void xxxDemo()
        {
            foreach (var team in teams)
            {
                if (dic.ContainsKey(team)) continue;
                List<string> tmp = new List<string>(teams);
                tmp.Remove(team);//移除自身
                foreach (var kv in dic)
                {
                    if (kv.Value.Contains(team))
                    {
                        //不能同时即为抽签又为被抽签队伍
                        tmp.Remove(kv.Key);
                    }
                }
                //移除已经选中2次的队伍
                var groups = dic.Values.SelectMany(c => c.Select(x => x)).GroupBy(x => x).Where(g => g.Count() >= 2);
                foreach (var g in groups)
                {
                    tmp.Remove(g.Key);
                }
                dic.Add(team, tmp.OrderBy(g => Guid.NewGuid()).Take(2).ToArray());
            }
            Console.WriteLine(dic.Count);
        }
最后一支队伍只有一个抽签的?
大鱼> 2018-03-07
  • 打赏
  • 举报
回复
看你情况对C#编程不怎么了解啊,或者是完全的小白啊
  • 打赏
  • 举报
回复
Console.WriteLine 不懂控制台输出么……
  • 打赏
  • 举报
回复
这只是demo代码,实际你肯定要做调整的,你直接复制进去,然后xxxDemo()就只行了
boy521 2018-03-07
  • 打赏
  • 举报
回复
引用 4 楼 starfd 的回复:
这只是demo代码,实际你肯定要做调整的,你直接复制进去,然后xxxDemo()就只行了
需要输入每次抽签队伍名称和两支被抽签队名称,如何描述?
boy521 2018-03-07
  • 打赏
  • 举报
回复
@娃都会打酱油了 您这段代码没有输出,请问在哪里加入?最后一支队伍应该不用抽签,自动获得另外两支被抽签队伍名称。另外,请问为何需要使用静态函数?上述代码可以在WINFORM上运行吗?
boy521 2018-03-07
  • 打赏
  • 举报
回复
最后一支队伍应该不用抽签,自动获得另外两支被抽签队伍名称。另外,请问为何需要使用静态函数?上述代码可以在WINFORM上运行吗?

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧