Лучший отвечающий
Не работает проверка значений

Вопрос
-
Создаеться массив [4,4] забиваются значения при помощи Random randObj = new Random().
Значения не должны повторяться, проверка происходит с помощью циклов.
Проблемма заключаеться в том, что значение в массиве все равно повторяються и нет значения 0.
Значения в массиве должны бить случайными от 0 до 15 и не повторяться!
int upper = 16; int RendomValues; Random randObj = new Random(); for (int x = 0; x != 4; x++) { for (int y = 0; y != 4; y++) { foreach (int n in intArray) { for (RendomValues = randObj.Next(upper); RendomValues == n; RendomValues=randObj.Next(upper)) { Console.WriteLine(RendomValues); } intArray[x, y] = RendomValues; } } Console.Write("\n"); } foreach (int n in intArray) Console.Write(" {0}",n); }
- Перемещено Siddharth Chavan 1 октября 2010 г. 21:44 MSDN Forums Consolidation (От:Visual C#)
2 марта 2010 г. 15:01
Ответы
-
Куча вариантов. Один из них - рандомизация случайным выбором, создаешь упорядоченный список чисел от 0 до 15, затем удаляешь из него случайные элементы и помещаешь их в матрицу
static void Main(string[] args) { List<int> lstInt = new List<int>(); for (int i = 0; i < 16; i++) { lstInt.Add(i); } Random rnd = new Random(); int[,] matrix = new int[4, 4]; int index; for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { index = rnd.Next(lstInt.Count); matrix[i, j] = lstInt[index]; lstInt.RemoveAt(index); } } for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { Console.Write(matrix[i, j] + "\t"); } Console.WriteLine(); } }
- Помечено в качестве ответа Artem Makukha 2 марта 2010 г. 18:55
2 марта 2010 г. 15:28
Все ответы
-
Куча вариантов. Один из них - рандомизация случайным выбором, создаешь упорядоченный список чисел от 0 до 15, затем удаляешь из него случайные элементы и помещаешь их в матрицу
static void Main(string[] args) { List<int> lstInt = new List<int>(); for (int i = 0; i < 16; i++) { lstInt.Add(i); } Random rnd = new Random(); int[,] matrix = new int[4, 4]; int index; for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { index = rnd.Next(lstInt.Count); matrix[i, j] = lstInt[index]; lstInt.RemoveAt(index); } } for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { Console.Write(matrix[i, j] + "\t"); } Console.WriteLine(); } }
- Помечено в качестве ответа Artem Makukha 2 марта 2010 г. 18:55
2 марта 2010 г. 15:28 -
Спасибо за ответ, но мне хотелось ведь понять что в моем коде не так, ведь логически все правильно и компилятор ошибок не выдает!2 марта 2010 г. 16:14
-
потому что "компилится"-это не значит что вы написали логически правильное приложение.
я вот совсем не понимаю что значит строка
for (RendomValues = randObj.Next(upper); RendomValues == n; RendomValues=randObj.Next(upper))2 марта 2010 г. 16:24 -
Генерит RendomValues не равный n, очевидно же.2 марта 2010 г. 16:26
-
потому что "компилится"-это не значит что вы написали логически правильное приложение.
я вот совсем не понимаю что значит строка
for (RendomValues = randObj.Next(upper); RendomValues == n; RendomValues=randObj.Next(upper))2 марта 2010 г. 16:55 -
Генерит RendomValues не равный n, очевидно же.
Не совсем понятно, можете объяснить подробней!
Заранее благодарен!2 марта 2010 г. 16:57 -
Это же твой код :) Как можно утверждать что он логически верен, если не знаешь смысл конкретной строки?2 марта 2010 г. 17:11
-
RendomValues = randObj.Next(upper); RendomValues == n; RendomValues=randObj.Next(upper)
Эта строка генерирует значение RendomValues, не равное n
foreach (int n in intArray) { for (RendomValues = randObj.Next(upper); RendomValues == n; RendomValues=randObj.Next(upper)) { Console.WriteLine(RendomValues); } intArray[x, y] = RendomValues; }
Этот цикл перебирает все значения в intArray. Для каждого из значений пытается сгенерировать не равное ему RendomValues. Если получилось - записывает его в intarray[x,y]. Ошибки:
- проверяется только на совпадение с последним рассмотренным элементом.
- intArray[x,y] для каждого x y генерируется 16 раз. всегда cохраняется только последнее значение. Т.е. например для x,y = 2,2 этим циклом ты:
генерируешь такое значение, которое не равно intArray[0,0]. записываешь его в [2,2];
генерируешь такое значение, которое не равно intArray[0,1]. записываешь его в [2,2];
генерируешь такое значение, которое не равно intArray[0,2]. записываешь его в [2,2];
...
генерируешь такое значение, которое не равно intArray[3,3]. записываешь его в [2,2];
intArray заполняется нулями по умолчанию. Поэтому на выходе получается массив совсем случайных значений (возможно, повторяющихся), при этом не равных нулю.
Основная ошибка - в подходе к решению задачи. Заполнить массив 4x4 случайными значениями от 0 до 15 без повторений - это на самом деле перемешать числа от 0 до 15 в случайном порядке, как и предложил OlegGel.2 марта 2010 г. 17:24 -
посмотрите ссылку, может быть вам подойдет2 марта 2010 г. 17:26