Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.11.2011, 18:40   #1
Defunate
Пользователь
 
Регистрация: 11.09.2010
Сообщений: 83
По умолчанию Расстановка чисел

Задача такая:расставить числа из заданного диапазона,без повторения.

Код:
  public static void Main()
        {
            int m = 10;
            int n = 10;
            List<int>[] mylist = new List<int>[4];
            for (int i = 0; i < mylist.Length; i++)
            {
                mylist[i] = new List<int>();
                mylist[i].AddRange(Generate(m, n));
            }
           }

       static IEnumerable<int> Generate(int max, int count)
       {
           return Generate(new Random(), max, count);
        }

        static IEnumerable<int> Generate(Random random, int max, int count)
        {
            max++;
            if (max < count)
                throw new ArgumentException();

            var indices = new int[count];
            for (var i = 0; i < count; i++)
            {
                indices[i] = random.Next(1,max);
                max--;
            }

            for (var i = 0; i < count; i++)
            {
                var value = indices[i];
                for (var j = i - 1; j >= 0; j--)
                {
                    if (indices[j] <= value)
                        value++;
                }

                yield return value;
            }
        }

Вопрос собственно такой,почему при заполнении каждой коллекции,в каждой коллекции оно ставит числа одинаково,а нужно-каждый раз поновому

Последний раз редактировалось Stilet; 19.11.2011 в 19:10.
Defunate вне форума Ответить с цитированием
Старый 20.11.2011, 02:03   #2
dampirik
Форумчанин
 
Регистрация: 02.07.2009
Сообщений: 722
По умолчанию

А может имеет смысл создать массив из элеметов по порядку 1.2.3.4.5.6... и потом их просто перемешать?
dampirik вне форума Ответить с цитированием
Старый 20.11.2011, 12:01   #3
Defunate
Пользователь
 
Регистрация: 11.09.2010
Сообщений: 83
По умолчанию

Так получиться что у меня всегда опять тоже будет перемешивание по одному принципу,первое-туда,второе-сюда и тд.мне же надо каждый раз новую последовательность.
Defunate вне форума Ответить с цитированием
Старый 20.11.2011, 12:40   #4
dampirik
Форумчанин
 
Регистрация: 02.07.2009
Сообщений: 722
По умолчанию

Я не совсем понимаю задание походу... нужно взять последовательность (упорядочную) определенной длинны и перемешать ее в хаотично порядке? так? и у Вас получается, что каждый раз после перемешивания последовательности равны?
dampirik вне форума Ответить с цитированием
Старый 20.11.2011, 13:04   #5
Defunate
Пользователь
 
Регистрация: 11.09.2010
Сообщений: 83
По умолчанию

Обьясню на числах: допустим у меня есть 5 чисел 1,2,3,4,5
мне нужно 1-ый раз допустим получить 2,1,3,5,4 дальше получить 1,3,5,2,4 и так далее,тоесть каждый раз получать новую перестановку из заданного множества
Defunate вне форума Ответить с цитированием
Старый 20.11.2011, 13:07   #6
Скарам
Дружите с Linq ;)
Форумчанин
 
Аватар для Скарам
 
Регистрация: 15.10.2008
Сообщений: 822
По умолчанию

Попробуй так, думаю, дело в этом:
Код:
return Generate(new Random(DateTime.Now.Millisecond), max, count);
Или сохранять ссылку на Random.
Не давай организму поблажки, каждый день тренируй его в шашки..
Скарам вне форума Ответить с цитированием
Старый 20.11.2011, 13:47   #7
Defunate
Пользователь
 
Регистрация: 11.09.2010
Сообщений: 83
По умолчанию

return Generate(new Random(DateTime.Now.Millisecond), max, count);

Вторая коллекция получила новые значения,а последующие-как и вторая коллекция)
Defunate вне форума Ответить с цитированием
Старый 20.11.2011, 15:10   #8
Скарам
Дружите с Linq ;)
Форумчанин
 
Аватар для Скарам
 
Регистрация: 15.10.2008
Сообщений: 822
По умолчанию

Код:
using System;
using System.Collections.Generic;

namespace ConsoleApplication1
{
    internal class Program
    {
        public static void Main()
        {
            int m = 10;
            int n = 10;
            var mylist = new List<int>[4];
            for (int i = 0; i < mylist.Length; i++)
            {
                mylist[i] = new List<int>();
                mylist[i].AddRange(Generate(m, n));
            }
        }

        private static Random random = new Random(DateTime.Now.Millisecond);
        private static readonly object syncLock = new object();

        private static IEnumerable<int> Generate( int max, int count)
        {
            max++;
            if (max < count)
                throw new ArgumentException();

            var indices = new int[count];
            for (int i = 0; i < count; i++)
            {

                lock (syncLock)
                    indices[i] = random.Next(1, max);
                    max--;
                
            }

            for (int i = 0; i < count; i++)
            {
                int value = indices[i];
                for (int j = i - 1; j >= 0; j--)
                {
                    if (indices[j] <= value)
                        value++;
                }

                yield return value;
            }
        }
    }
}
Попробуй так.
Не давай организму поблажки, каждый день тренируй его в шашки..
Скарам вне форума Ответить с цитированием
Старый 20.11.2011, 15:27   #9
Defunate
Пользователь
 
Регистрация: 11.09.2010
Сообщений: 83
По умолчанию

Спасибо!всё работает,а не мог бы ты объяснить в чём была проблема-то
Defunate вне форума Ответить с цитированием
Старый 20.11.2011, 15:57   #10
Скарам
Дружите с Linq ;)
Форумчанин
 
Аватар для Скарам
 
Регистрация: 15.10.2008
Сообщений: 822
По умолчанию

Случайные числа на самом деле не случайны, а псевдослучайны. По сути последовательность чисел зависит от числа основания. Т.е. если задавать одно и тоже число в конструторе random получишь одну и ту жке последовательность. В конструкторе по умолчанию random() задается какая-то костанта, поэтому сколько его не вызывай после получишь одинаковые последовательности (твой первый код) . Я предложил генерить от времени, но, видимо, милисекунды не успевали меняться (мое первое предложение). Сохранив ссылку на экземпляр класса мы избавились от необходимости менять основание и последовательности получились разные. Подробнее можно почитать в википедии.)
Не давай организму поблажки, каждый день тренируй его в шашки..
Скарам вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Игра "Расстановка девяти чисел"(ПАСКАЛЬ) Таня.Ку Помощь студентам 1 29.03.2010 13:29
Расстановка видеокамер по городу Pavel_Ine Помощь студентам 0 08.05.2009 15:08
Расстановка Табуляции B00lean Microsoft Office Word 1 22.03.2009 18:10
(+,-,*,/)Расстановка знаков МаксимNEWProgramm Паскаль, Turbo Pascal, PascalABC.NET 5 17.04.2008 17:04