none
Не работает проверка значений RRS feed

  • Вопрос

  • Создаеться массив [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