예제 #1
0
        private static void SeedGen()
        {
            var cards = Desk.GenerateCards().ToArray();

            File.Delete("seeds.txt");
            var outs = new BufferedStream(File.OpenWrite("seeds.txt"));

            ThreadPool.SetMinThreads(16, 16);
            ThreadPool.SetMaxThreads(64, 64);
            var startTime = DateTime.Now;
            ThreadLocal <Card[]> lists = new ThreadLocal <Card[]>(() => new Card[54]);
            ThreadLocal <int[]>  bufs  = new ThreadLocal <int[]>(() => new int[15]);

            Parallel.For(0, int.MaxValue, new ParallelOptions {
                MaxDegreeOfParallelism = 64
            }, i =>
            {
                total++;
                var list = lists.Value;
                var buf  = bufs.Value;
                Array.Copy(cards, 0, list, 0, 54);
                list.Shuffle(i);

                ProcessCards(list, buf, i, 1);
                for (int a = 0; a < 17; a++)
                {
                    var tmp      = list[a];
                    list[a]      = list[a + 34];
                    list[a + 34] = tmp;
                }
                ProcessCards(list, buf, i, 2);
                for (int a = 17; a < 34; a++)
                {
                    var tmp      = list[a];
                    list[a]      = list[a + 17];
                    list[a + 17] = tmp;
                }
                ProcessCards(list, buf, i, 3);
            });
            outs.Close();

            //[MethodImpl(MethodImplOptions.AggressiveInlining)]
            void ProcessCards(Card[] list, int[] buf, int i, int extra)
            {
                var doubleKing = false;
                int ptr = 0, cnt = 0;

                for (var r = 1; r <= 3; r++)
                {
                    int rightPtr = r * 17;
                    if (r == 3)
                    {
                        rightPtr = 54;
                    }

                    int lcnt2 = 0;
                    for (; ptr < rightPtr; ptr++)
                    {
                        var c      = list[ptr];
                        var amount = c.Amount.Amount;
                        buf[amount]++;
                        if (buf[amount] == 4)
                        {
                            cnt++;
                        }
                        if (c.Type == CardType.King)
                        {
                            lcnt2++;
                        }
                    }

                    if (lcnt2 == 2)
                    {
                        doubleKing = true;
                    }
                    for (var a = 0; a < 15; a++)
                    {
                        buf[a] = 0;
                    }
                }

                if (cnt <= 6)
                {
                    return;
                }
                valid++;

                var t   = (DateTime.Now - startTime).TotalMilliseconds;
                var str =
                    $"Bomb count: {cnt}, seed {i} , doubleKing {doubleKing}, TotalCount {total}, validCount {valid}, time {t / 1000}s, totalSpeed {total / t}/ms, validS {valid / t * 1000 * 60}/min {extra}\r\n";
                var str2 = $"{i} {cnt} {doubleKing} {t / 1000} {extra}\r\n";
                var bts  = Encoding.UTF8.GetBytes(str2);

                lock (_flock)
                {
                    outs.WriteAsync(bts, 0, bts.Length);
                }
                Console.ForegroundColor = doubleKing ? ConsoleColor.Yellow : ConsoleColor.White;
                Console.Write(str);
            }
        }
예제 #2
0
        private static void SeedGen()
        {
            var cards = Desk.GenerateCards();

            File.Delete("seeds.txt");
            ThreadPool.SetMinThreads(16, 16);
            ThreadPool.SetMaxThreads(64, 64);
            var startTime = DateTime.Now;

            Parallel.For(0, int.MaxValue, new ParallelOptions {
                MaxDegreeOfParallelism = 64
            }, i =>
            {
                total++;
                var list = new List <Card>(cards);
                list.Shuffle(i);

                var cards1          = list.Take(17).ToListAndSort();
                var pCard1          = cards1.ExtractCardGroups();
                var cards2          = list.Skip(17).Take(17).ToListAndSort();
                var pCard2          = cards2.ExtractCardGroups();
                var cards3          = list.Skip(17 * 2).Take(17).ToListAndSort();
                var pCard3          = cards3.ExtractCardGroups();
                var count           = 0;
                var doubleKingCount = 0;
                var doubleKing      = false;
                foreach (var cardGroup in pCard1)
                {
                    if (cardGroup.Count == 4)
                    {
                        count++;
                    }
                }

                foreach (var cardGroup in pCard2)
                {
                    if (cardGroup.Count == 4)
                    {
                        count++;
                    }
                }

                foreach (var cardGroup in pCard3)
                {
                    if (cardGroup.Count == 4)
                    {
                        count++;
                    }
                }

                foreach (var card in cards1)
                {
                    if (card.Type == CardType.King)
                    {
                        doubleKingCount++;
                    }
                }
                if (doubleKingCount == 2)
                {
                    doubleKing = true;
                    goto x;
                }

                doubleKingCount = 0;
                foreach (var card in cards2)
                {
                    if (card.Type == CardType.King)
                    {
                        doubleKingCount++;
                    }
                }
                if (doubleKingCount == 2)
                {
                    doubleKing = true;
                    goto x;
                }

                doubleKingCount = 0;
                foreach (var card in cards3)
                {
                    if (card.Type == CardType.King)
                    {
                        doubleKingCount++;
                    }
                }
                if (doubleKingCount == 2)
                {
                    doubleKing = true;
                }

                x:
                if (count > 5)
                {
                    valid++;
                    Console.ForegroundColor = doubleKing ? ConsoleColor.Yellow : ConsoleColor.White;
                    var t   = (DateTime.Now - startTime).TotalMilliseconds;
                    var str = $"Bomb count: {count}, seed {i} , doubleKing {doubleKing}, TotalCount {total}, validCount{valid}, time {t/60}s, totalSpeed {total / t}/ms, validS {valid / t * 1000 * 60}/min\r\n";
                    File.AppendAllText("seeds.txt", str);
                    Console.Write(str);
                }
            });
        }