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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.10.2011, 18:01   #1
RedScreenOfLife
Пользователь
 
Аватар для RedScreenOfLife
 
Регистрация: 12.07.2010
Сообщений: 45
По умолчанию проблема случая

Случайным образом нужно заполнить массив от 1 до n. Проблема в том, что при использовании класса Random, при каждом увеличении n, программа все дольше и дольше считает...то есть чем меньше n тем быстрее работает. Есть какие-то альтернативы заполнения массива?

Вот отрывок:
Код:
flag = true;

for (int i = 0; i < n; i++)
            {
                top = r.Next(0, n+1);
                foreach (int z in way)
                    if (z == top) { i=-1; flag = false; }
                if (!flag) { flag = true; continue; }
                way[i] = top;
            }
RedScreenOfLife вне форума Ответить с цитированием
Старый 16.10.2011, 21:41   #2
Prizrak86
Форумчанин
 
Аватар для Prizrak86
 
Регистрация: 15.10.2011
Сообщений: 139
По умолчанию

Цитата:
Сообщение от RedScreenOfLife Посмотреть сообщение
Случайным образом нужно заполнить массив от 1 до n. Проблема в том, что при использовании класса Random, при каждом увеличении n, программа все дольше и дольше считает...то есть чем меньше n тем быстрее работает. Есть какие-то альтернативы заполнения массива?

Вот отрывок:
Код:
flag = true;

for (int i = 0; i < n; i++)
            {
                top = r.Next(0, n+1);
                foreach (int z in way)
                    if (z == top) { i=-1; flag = false; }
                if (!flag) { flag = true; continue; }
                way[i] = top;
            }
Попробуй вот так
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Заполнение_массива_случайными_числами
{
    class Program
    {
        static void Main(string[] args)
        {
            Random r = new Random();
            int max, rm;
            Console.Write("Максимальное значение случайных чисел ");
            max = int.Parse(Console.ReadLine());
            Console.Write("Размер массива ");
            rm = int.Parse(Console.ReadLine());
            int[] mass = new int[rm];
            for (int n = 0; n < rm; n++)
            {
                mass[n] = r.Next(max+1);
                Console.WriteLine("mass[{0}]={1}",n+1,mass[n]);
            }
            Console.ReadKey();
        }
    }
}
Программист это не профессия, программист - это образ жизни.
Prizrak86 вне форума Ответить с цитированием
Старый 16.10.2011, 21:48   #3
RedScreenOfLife
Пользователь
 
Аватар для RedScreenOfLife
 
Регистрация: 12.07.2010
Сообщений: 45
По умолчанию

сори, забыл сказать, что все числа в массиве должны быть уникальны...тоесть если интервал (1, 10), то в массиве должно быть чтото типа: 8371594652
RedScreenOfLife вне форума Ответить с цитированием
Старый 16.10.2011, 22:34   #4
Prizrak86
Форумчанин
 
Аватар для Prizrak86
 
Регистрация: 15.10.2011
Сообщений: 139
По умолчанию

Цитата:
Сообщение от RedScreenOfLife Посмотреть сообщение
сори, забыл сказать, что все числа в массиве должны быть уникальны...тоесть если интервал (1, 10), то в массиве должно быть чтото типа: 8371594652
я не учитывал того что если размер массива больше количества вариантов случайных чисел произойдет зацикливание, а так же вывод сделан таким образом что бы показать как именно осуществляется перебор чисел в массив.

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

namespace Заполнение_массива_случайными_числами
{
    class Program
    {
        static void Main(string[] args)
        {
            Random r = new Random();
            int max, rm;
            Console.Write("Максимальное значение случайных чисел ");
            max = int.Parse(Console.ReadLine());
            Console.Write("Размер массива ");
            rm = int.Parse(Console.ReadLine());
            int[] mass = new int[rm];
            for (int n = 0; n < rm; n++)
            {
                mass[n] = r.Next(max + 1);
                Console.WriteLine("mass[{0}]={1}", n + 1, mass[n]);
                for (int m = 0; m < n; m++)
                {
                    if (mass[n] == mass[m])
                    {
                        n--;
                    }
                }
            }
            Console.ReadKey();
        }
    }
}
Программист это не профессия, программист - это образ жизни.
Prizrak86 вне форума Ответить с цитированием
Старый 16.10.2011, 22:57   #5
Скарам
Дружите с Linq ;)
Форумчанин
 
Аватар для Скарам
 
Регистрация: 15.10.2008
Сообщений: 822
По умолчанию

Думаю, лучше написать вот так:
Код:
using System;
using System.Collections;
using System.Linq;

namespace ConsoleApplication4
{
    class Program
    {
        static void Main(string[] args)
        {
            int max, rm;
            Console.Write("Максимальное значение случайных чисел ");
            max = int.Parse(Console.ReadLine());
            Console.Write("Размер массива ");
            rm = int.Parse(Console.ReadLine());
            var array=new ArrayList();
            var rand=new Random(DateTime.Now.Millisecond);
            for(int i=0; i<rm;i++)
            {
                int newitem;
                do
                {
                    newitem = rand.Next(0, max);
                } while (array.Contains(newitem));
                array.Add(newitem);
            }
            array.ToArray().ToList().ForEach(Console.WriteLine);
            Console.ReadKey();
        }
    }
}
Тогда будет гарантия уникальности, только надо еще пару проверок сделать, например, максимальное число должно быть больше размерности массива.
Не давай организму поблажки, каждый день тренируй его в шашки..
Скарам вне форума Ответить с цитированием
Старый 16.10.2011, 23:18   #6
Prizrak86
Форумчанин
 
Аватар для Prizrak86
 
Регистрация: 15.10.2011
Сообщений: 139
По умолчанию

Вот мой конечный код. скомпилируй.

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

namespace Заполнение_массива_случайными_числами
{
    class Program
    {
        static void Main(string[] args)
        {
            Random r = new Random();
            int min, max, rm;
            do
            {
                Console.Write("Минимальное значение случайных чисел ");
                min = int.Parse(Console.ReadLine());
                Console.Write("Максимальное значение случайных чисел ");
                max = int.Parse(Console.ReadLine());
                Console.Write("Размер массива ");
                rm = int.Parse(Console.ReadLine());
                if (rm - 1 > max - min)
                {
                    Console.Clear();
                    Console.WriteLine("Error: Размер массива не может быть меньше разности максимального и минимального значений случайных неповторяющихся чисел");
                    Console.WriteLine();
                };
                if (min >= max)
                {
                    Console.Clear();
                    Console.WriteLine("Error: максимальное значение всегда должно быть больше минимального значения");
                    Console.WriteLine();
                };
            }
            while (rm - 1 > max - min || min >= max);
            int[] mass = new int[rm];
            for (int n = 0; n < rm; n++)
            {
                mass[n] = r.Next(min, max + 1);
                for (int m = 0; m < n; m++)
                {
                    if (mass[n] == mass[m])
                    {
                        n--;
                    };
                }
            }
            for (int n = 0; n < rm; n++)
            {
                Console.WriteLine("mass[{0}]={1}", n + 1, mass[n]);
            }
            Console.ReadKey();
        }
    }
}
Программист это не профессия, программист - это образ жизни.
Prizrak86 вне форума Ответить с цитированием
Старый 17.10.2011, 00:18   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

хм.. никто не предложил простой способ, который очень часто используется в подобных случаях (на любых ЯП).

1) в цикле от 1 до N заполняется массив последовательными числами for (int i = 0; i < n; i++) a[i] = i;

2) значения в цикле ПЕРЕМЕШИВАЮТСЯ случайным образом.
смотри, например, на форуме:
Цитата:
Единственное, если подходить к вопросу серьёзно, необходимо учитывать, что распределение получается неравномерным. смотри пост №11 (с) kogemrka или, статью, на которую он ссылается:
http://mazanu.com/2008/11/blog-post_20.html Как не надо тасовать карты
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа для случая обтекания идеальной несжимаемой жидкостью конуса, С++ flast1k Фриланс 0 17.05.2011 15:08
Проблема с рамами/Проблема с ЖД DRAGGER Компьютерное железо 6 04.01.2009 23:37