Вот так не годится?
| Код | static void Main() { // входные данные алгоритма int cols = 10, rows = 10; int minValue = 1, maxValue = 5; int maxZeroValues = 4;
repeat: Console.Clear();
// выходные данные int[,] nums = new int[rows, cols]; Dictionary<int, int> numStat = new Dictionary<int, int>(cols * rows);
// вспомогательные переменные Random rnd = new Random(DateTime.Now.Millisecond); int n, zeroCount = 0;
// начало for (int r = 0; r < rows; r++) { for (int c = 0; c < cols; c++) { // выбираем вероятность около 5% для выпадения "0", порядок следования условий лучше не менять if ((zeroCount < maxZeroValues) && (rnd.NextDouble() < 0.05)) { n = 0; zeroCount++; } else { n = rnd.Next(minValue, maxValue + 1); // числа от 1 до 5
if (!numStat.ContainsKey(n)) // если стаистика на число не заведена, то numStat.Add(n, 0); numStat[n]++; } nums[r, c] = n; } } // в случае, если нулей выпало меньше, то while (zeroCount < maxZeroValues) { int r = rnd.Next(rows); int c = rnd.Next(cols); if (nums[r, c] == 0) continue; nums[r, c] = 0; zeroCount++; } // конец
// выводим результаты Console.WriteLine("Состояние матрицы ({0}x{1}):", rows, cols); for (int r = 0; r < rows; r++) { for (int c = 0; c < cols; c++) { Console.Write(nums[r, c] + " "); } Console.WriteLine(); }
Console.WriteLine(); Console.WriteLine("Состояние статистики:"); Console.WriteLine(" Нулей в матрице: {0}", zeroCount); Console.WriteLine(" Остальных чисел (число->количество):"); Console.Write(" "); foreach (KeyValuePair<int, int> pair in numStat) Console.Write("{0}->{1}; ", pair.Key, pair.Value); Console.WriteLine();
Console.WriteLine(); Console.WriteLine("Нажмите 'R' для перезапуска или лубую другую клавишу для выхода"); ConsoleKeyInfo cki = Console.ReadKey(); if (cki.KeyChar == 'r' || cki.KeyChar == 'R') goto repeat; }
|
|