public static double SearchMeanPercent(PercentDelegate SearchPercent, SearchParameters parameters, double averChange, Solver solver, Random rand) { double average = 0; int runNumber = 0; int accuracyAmount = 0; int runFinish; do { double diff = runNumber != 0 ? average / runNumber : 0; average += SearchPercent(parameters, solver, rand); parameters.Clear(); runNumber++; diff = Math.Abs(average / runNumber - diff); accuracyAmount = (diff < averChange) ? accuracyAmount + 1 : 0; } while (accuracyAmount < 10); runFinish = runNumber * 10; var iterations = runFinish - runNumber; var quantity = Environment.ProcessorCount; var step = (int)Math.Ceiling((double)iterations / quantity); runNumber += step * quantity; int threadsSum = 0; Parallel.For(0, quantity, i => { int sumLocal = 0; var solverLocal = new Solver(); var randLocal = new Random(); var paramsLocal = parameters.Copy(); for (var j = 0; j < step; j++) { sumLocal += SearchPercent(paramsLocal, solverLocal, randLocal); paramsLocal.Clear(); } Interlocked.Add(ref threadsSum, sumLocal); } ); average += threadsSum; average /= runNumber; return(average); }