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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.01.2012, 22:12   #1
Саня_
Пользователь
 
Регистрация: 05.03.2011
Сообщений: 36
По умолчанию Линейный массив

Мне нужно создать линейный массив из 20 целы положительных чисел, при этом нужно, что бы они не повторялись. Суть проблемы в том, что я не могу сделать так, что бы они не повторялись...
Цитата:
N: array of integer;
i: integer;

begin
SetLength(N,20);
randomize;
i:=0;
while i<20 do
begin
N[i]:=random(100);
i:=i+1;
end;
end;
Саня_ вне форума Ответить с цитированием
Старый 21.01.2012, 22:30   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Получи значение рандома во временную переменную, циклом пройдись по уе заполненным элементам и проверяй, есть ли такое. Если есть, то генерируй снова, иначе плюсуй в массив.
Человек_Борща вне форума Ответить с цитированием
Старый 21.01.2012, 23:36   #3
Саня_
Пользователь
 
Регистрация: 05.03.2011
Сообщений: 36
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Получи значение рандома во временную переменную, циклом пройдись по уе заполненным элементам и проверяй, есть ли такое. Если есть, то генерируй снова, иначе плюсуй в массив.
спасибо за совет, уже работает)
Саня_ вне форума Ответить с цитированием
Старый 22.01.2012, 09:00   #4
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,899
По умолчанию

Не очень хорошее решение. Теоретически (а на больших размерах массива может быть и практически) такой алгоритм бесконечен.

Всегда такая задача делалась через заполнение массива по любому закону в возрастающем порядке (как пример обычное +1) и потом перемешиванием в случайном порядке такого массива.
Примерно так, сложность такого алгоритма O(n)
Код:
const megasize = 1000000 ;
type megar = array[1..megasize] of integer;
procedure tform1.makeranduniquemegaarray(var arr : megar);
var i,j,k  : integer ;
begin
for i := 1 to megasize
  do arr[i] := i ;
for i := 1 to megasize
  do begin
  j := random(megasize-i)+1 ;
  k := arr[megasize+1-i] ;
  arr[megasize+1-i] := arr[j] ;
  arr[j] := k ;
  end;
end;

Последний раз редактировалось phomm; 22.01.2012 в 09:04.
phomm вне форума Ответить с цитированием
Старый 22.01.2012, 10:13   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

phomm, согласен, я тоже часто пользуюсь подобным подходом.
вот только у Вас перемешивание с "изъяном"...

цитирую свой пост:
Код:
Единственное, если подходить к вопросу серьёзно, необходимо учитывать, что распределение получается неравномерным. смотри пост №11 (с) kogemrka или, статью, на которую он ссылается:
http://mazanu.com/2008/11/blog-post_20.html Как не надо тасовать карты
если кратно, то алгоритм перемешивания (с нормальным распределением) должен быть такой:
Цитата:
Для (i от 1 до n-1) Переставить i-ю карту со случайной картой от i-й до n-й
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывести линейный массив на экран. badname47 Паскаль, Turbo Pascal, PascalABC.NET 6 19.12.2011 15:40
C++,линейный список katerunechka Помощь студентам 0 08.10.2011 11:38
линейный массив, max i min Славик777 Помощь студентам 1 20.05.2011 15:46
Сформировать линейный массив из отрицательных чисел. Bikborppp Помощь студентам 0 28.10.2010 16:28