static void Main(string[] args)
{
    Func<int, string> getName = p => {
        var s = new[] { "黑桃", "红桃", "梅花", "方块" };
        var n = new[] { "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K" };
        return p < 52 ? s[p/13] + n[p%13] : p == 52 ? "JokerSmallJoker" : "JokerBigJoker";
    };
    var buf = new byte[54];
    using(var rnd = new RNGCryptoServiceProvider())
        rnd.GetBytes(buf);
    var ps = Enumerable.Range(0, buf.Length).OrderBy(p => buf[p])
        .Select((p, i) => new {p,i}).GroupBy(t => t.i > 50 ? 3 : t.i%3, t => t.p).OrderBy(g => g.Key);
    var r = new[] { "角色A", "角色B", "角色C", "底牌" };
    foreach (var g in ps)
    {
        Console.Write(r[g.Key] + ":");
        foreach (var p in g)
            Console.Write(getName(p) + " ");
        Console.WriteLine("\r\n");
    }
}

解决方案 »

  1.   

    var list = new List(Poker);
    //数据填充
    list = list.OrderBy(r=>Guid.NewGuid()).ToList();
    //怎么发就随便你了
    直接一切三,跳着发,都可以
      

  2.   

    static string[] PokerValues = new string[] { "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2" };
            static Dictionary<byte, string> PokerColors = new Dictionary<byte, string>() { { 0, "方片" }, { 1, "红桃" }, { 2, "梅花" }, { 3, "黑桃" } };
            static void R()
            {
                List<Poker> list = new List<Poker>();
                foreach (string p in PokerValues)
                {
                    foreach (byte c in PokerColors.Keys)
                    {
                        list.Add(new Poker() { Color = c, Value = p });
                    }
                }
                list.Add(new Poker() { Color = 5, Value = "JQ" });//小鬼
                list.Add(new Poker() { Color = 6, Value = "JQ" });//大鬼
                list = list.OrderBy(p => Guid.NewGuid()).ToList();
                Func<byte, string> colorFunc = (i) =>
                {
                    switch (i)
                    {
                        case 5:
                            return "小";
                        case 6:
                            return "大";
                        default:
                            return PokerColors[i];
                    }
                    
                };
                foreach (var p in list)
                {
                    Console.Write(string.Format("Color:{0} Value:{1}  ", colorFunc(p.Color), p.Value));
                }
            }
            public class Poker
            {
                public byte Color { get; set; }
                public string Value { get; set; }
            }
    只有初始化加打乱顺序的代码
      

  3.   

    额,完全多余的写法
    1. 54张牌没必要先分什么花色,就是1--52个数字,判定花色直接 取和13 商,牌点则是和13模.53,54为大小王
    2. 54张牌直接乱序排序见6楼
    3. 发牌先扣3张底牌,然后按index 模3分组