Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Проблема с заполнением массива


Автор: KonH 18.2.2010, 14:29
Требуется сделать заполнение массива матриц неодинаковыми матрицами 2х2 с элементами от 0 до z. 
Конкретных функций не нашел, пришлось довольствоваться рандомом. 
Но все равно в итоге может попасться пара одинаковых матриц. Ошибки не вижу, за помощь заранее спасибо smile

Функция заполнения массива (List<>):

 
Код

       public void Matrix_Make()
        {
            Random r = new Random(DateTime.Now.Millisecond);
            matrixes.Clear();
            for (int i = 0; i < Math.Pow(z, 4); i++)
            {
                Matrix item = new Matrix(z);
                int a = 0, b = 0, c = 0, d = 0;
                while (Cont(a, b, c, d) == true)
                {
                    a = r.Next(z);
                    b = r.Next(z);
                    c = r.Next(z);
                    d = r.Next(z);
                }
                item.elements[0] = a;
                item.elements[1] = b;
                item.elements[2] = c;
                item.elements[3] = d;
                matrixes.Add(item);
            }
        }


Проверка на наличие одинаковых элементов:

Код

        public bool Cont(int a, int b, int c, int d)
        {
            for (int i = 0; i < matrixes.Count; i++)
            {
                if (matrixes[i].elements[0] == a && matrixes[i].elements[1] == b && matrixes[i].elements[2] == c && matrixes[i].elements[3] == d)
                    return true;
            }
            return false;
        }

Автор: Dobermann 18.2.2010, 16:17
Вообще правильно будет так
Код

 if ((matrixes[i].elements[0] == a) && (matrixes[i].elements[1] == b) && (matrixes[i].elements[2] == c) && (matrixes[i].elements[3] == d))

Автор: KonH 18.2.2010, 17:55
Ничего не изменилось. Мне вот до сих пор не понятно, как такая простая функция может быть проблемной. 

Автор: Ceiceron 20.2.2010, 11:12
KonH, z - это некое число, водимое как параметр? Тогда вопрос: почему r.Next(z) от него зависит, собственно это и ограничивает ваш набор чисел. Либо алгоритм предполагает что число будет достаточно большим и все возможные числа попадут в матрицы, но тогда количество возможных итераций намного превосходит число этих чисел. Соответственно рендом начинает повторяться.

Т.е. если я введу z=1, то у меня сгенерируется одна матрица у которой при использовании r.Next(z) все значений всегда будут либо 0, либо 1.

Автор: KonH 21.2.2010, 16:00
Как бы из for (int i = 0; i < Math.Pow(z, 4); i++) видно, что будет произведено z^4 итераций цикла, то есть столько, чтобы получить все возможные варианты для матрицы 2х2 со значениями каждого элемента 0-z. Если их больше - программа зависает, что логично. 
Вопрос в том, почему Cont не верно работает, ведь в остальном сложно найти какую-либо проблему.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)