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); } }
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); } }); }