Нестандартный способ заполнения матрицы?

Подскажите пожалуйста! Есть у меня массив произвольного размера скажем (10х10) мне необходима за один цикл заполнить его значении от 1 до 5 и дополнительное условия что в этой матрицы должно быть заданное кол-во пустых значений (0) скажем скажем из 4 штуки. Хочется чтоб они были не подряд и каждый раз их было ровно столько сколько я хочу не больше ни меньше. Также дополнительное условие  что эти пустые значения (0) должны быть не в куче а разбросаны по матрице. И еще хотелось бы в этом же цикле определить каких значений больше из набора 1-5.  Конечна достаточно сделать цикл кучу условий и прочего но хочется видеть некое оригинальное решение. ( к примеру захочу я числа не от 1-5 а от 6-10 или вообще диапазон значений будет вводится). Заранее спасибо всем кто поможет.  P.S. Не отправляйте в центр помощи или колледж это не для работы не для учебы а для развития 
7 ответов

Вот так не годится?
        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.**********() < 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 (************<int, int> pair in numStat)                Console.Write("{0}->{1}; ", pair.Key, pair.Value);            Console.WriteLine();            Console.WriteLine();            Console.WriteLine("Нажмите 'R' для перезапуска или лубую другую клавишу для выхода");            ************** cki = Console.ReadKey();            if (cki.KeyChar == 'r' || cki.KeyChar == 'R')                goto repeat;        }


-Mikle-, спасибо кое что сгадится а вот зачем масив статискики размером ссому матрицу? и ще плохо это
            // в случае, если нулей выпало меньше, то            while (zeroCount < maxZeroValues)            {                int r = rnd.Next(rows);                int c = rnd.Next(cols);                if (nums[r, c] == 0) continue;                nums[r, c] = 0;                zeroCount++;            }
Хочется все в одном цикле 


а вот зачем масив статискики размером ссому матрицу?
Это недоделка, у меня была другая мысль сначала.замени на 
    Dictionary<int, int> numStat = new Dictionary<int, int>(maxValue + 1 - minValue);
или вообще можно убрать расчет длины
    Dictionary<int, int> numStat = new Dictionary<int, int>();
Хочется все в одном цикле 
А чем это не устраивает? Кол-во итераций будет не больше допустимого кол-ва нулей. Я повторю, не больше, чаще будет даже меньше.Нужно еще подумать тут, что лучше, несколько лишних (а иногда и их отсутствие) итераций с простыми операциями или какой-либо более сложный расчет и более сложное условие выполняющееся (cols*rows) раз...


Нужно еще подумать тут, что лучше, несколько лишних (а иногда и их отсутствие) итераций с простыми операциями или какой-либо более сложный расчет и более сложное условие выполняющееся (cols*rows) раз...
ИмХО, вообще проще было сначала заполнить матрицу числами из заданного диапазона, а потом заменить несколько чисел нулями. К тому же выполнить условие
Также дополнительное условие  что эти пустые значения (0) должны быть не в куче а разбросаны по матрице. 
В этом случае будет куда проще.


ИмХО, вообще проще было сначала заполнить матрицу числами из заданного диапазона, а потом заменить несколько чисел нулями. К тому же выполнить условие
Я думал об этом, но потом пришел к выводу, что если нулей понадобится не 4, а скажем 40, то общее кол-во итераций будет увеличится полтора раза. Потому и решил, что часть нулей нужно запихнуть уже в первом цикле.


Но в этом случае контролировать "кучность" намного сложнее, да и в целом алгоритм усложняется. А если учесть, что речь идёт о целочисленных операциях, то вряд ли они систему сильно загрузят. К тому же все эти подсчёты статистики и прочее тоже что-кушают.


diadiavova-Mikle-,  спасибо вам огромное!