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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.12.2010, 08:39   #11
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

1. Создать динамический массив от 1 до 100
2. В случайном порядке брать с него элементы и "выдергивать" их с массива
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 15.12.2010, 09:41   #12
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Всю жизнь делал так
Код:
var
  Arr: array [1..100] of Byte;
  i, j: Integer;
  b: Byte;
begin
  for i := 1 to 100 do
    Arr[i] := i;
  Randomize;
  for i := 1 to 100 do begin
    j := Random (99)+1;
    b := Arr[i];
    Arr[i] := Arr[j];
    Arr[j] := b;
  end;
  Memo1.Lines.Clear;
  for i := 1 to 100 do
    Memo1.Lines.Add (IntToStr (Arr[i]));
end;
Sibedir вне форума Ответить с цитированием
Старый 15.12.2010, 10:17   #13
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Utkin, ну не знаю, можно, конечно и так, но возня с динамическими массивами ("выдернуть" элемента - это значит все последующие в цикле переписать на его место, а потом уменьшить размерность массива) - всё это и достаточно замудрённо, да и на быстродействии явно сказывается не лучшим образом (хотя, конечно, в данном случае за 0.01 миллисекунду выполнится программа или, в 100 раз дольше, за 1 миллисекунду - не существенно )

но мне для решения таких задач ГОРАЗДО больше нравится вариант с перемешиванием. ( можно тут посмотреть, да и в данной теме уже он был предложен) - он очень быст, прост и не требует наличия и манипулирования динамическими массивами!
Единственное, если подходить к вопросу серьёзно, необходимо учитывать, что распределение получается неравномерным. смотри пост №11 (с) kogemrka или, статью, на которую он ссылается:
http://mazanu.com/2008/11/blog-post_20.html
Цитата:
Как не надо тасовать карты

Частичный перевод статьи
How We Learned to Cheat at Online Poker: A Study in Software Security
by Brad Arkin, Frank Hill, Scott Marks, Matt Schmid and Thomas John Walls
вот примерно так (взял код Genco за основу):
Код:
const N = 100;
var
 i,k,buf:integer;
 mas: array [1..N] of integer;
begin
 //заполнить
 for i:=1 to N do mas[i]:=i;
 Randomize;

 //----------перемешать-------------
 for i:=1 to N-1 do
  begin
   k:= Random(N-i+1)+i;
   if k<>i then begin
     buf:=mas[i];
     mas[i]:=mas[k];
     mas[k]:=buf;
   end;
  end;
 //-------------вывести-------------
 Memo1.Lines.Clear;
 for i:=1 to N do
  begin
   Memo1.Lines.Add(inttostr(mas[i]));
  end;
end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 15.12.2010, 11:01   #14
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Utkin, ну не знаю, можно, конечно и так, но возня с динамическими массивами ("выдернуть" элемента - это значит все последующие в цикле переписать на его место, а потом уменьшить размерность массива) - всё это и достаточно замудрённо, да и на быстродействии явно сказывается не лучшим образом (хотя, конечно, в данном случае за 0.01 миллисекунду выполнится программа или, в 100 раз дольше, за 1 миллисекунду - не существенно )
Это потому что Вы динамический массив рассматриваете как динамический массив . Однако в рамках алгоритма, нам нужен не динамический массив, а множество все чисел от 1 до 100. Сам порядок их следования для алгоритма пофигу. Просто их удобно вносить в цикле как 1, 2, 3, 4, 5, 6 и т.д. Однако брать-то мы их будем все равно в случайном порядке. Следовательно "выдергивание" элемента надо осуществлять не из динамического массива, а из множества. Иными словами, можно "выдернутый" элемент заменять последним, а последний удалять. Ничего мудреного, все просто как колобок . И быстродействие (удаления элемента) вполне примелимо, а главное оно примерно одинаково и не зависит от числа элементов в массиве.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 15.12.2010, 11:59   #15
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

поздно дело было, спать хотел)
думаю теперь не наидете ошибок

Код:
procedure TForm1.Button3Click(Sender: TObject);
var
  l,p:integer;
  f:byte;
  d: array [1..100] of byte;
begin
Memo1.Clear;
for p:= 1 to 100 do
  d[p]:=p;
randomize;
for l:= 1 to 100 do
begin
  f:=random(101-l);
  Memo1.Lines.Add(Inttostr(d[f+1]));
  d[f+1]:=d[101-l];
end;
end;
[/QUOTE]
VirusN13

Последний раз редактировалось ArtGrek; 15.12.2010 в 12:53.
ArtGrek вне форума Ответить с цитированием
Старый 15.12.2010, 12:46   #16
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Сообщение от ArtGrek Посмотреть сообщение
поздно дело было, спать хотел)
думаю теперь не наидете ошибок
Одну нашел . Ваш код всегда формирует одну последовательность. Таким образом я могу вручную по-китайски напрямую вводить последовательность в Мемо .
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 15.12.2010, 12:50   #17
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

Цитата:
Ваш код всегда формирует одну последовательность.
Код:
...
randomize;
for l:= 1 to 100 do
...
и можно еше
Код:
...
Memo1.Clear;
for p:= 1 to 100 do
...
VirusN13
ArtGrek вне форума Ответить с цитированием
Старый 15.12.2010, 13:12   #18
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

Код:
procedure TForm1.Button3Click(Sender: TObject);
var
  l,p:integer;
  f:byte;
  d: array [1..100] of byte;
begin
Memo1.Clear;
for p:= 1 to 100 do
  d[p]:=p;
randomize;
for l:= 1 to 100 do
begin
  f:=random(101-l);
  Memo1.Lines.Add(Inttostr(d[f+1]));
  d[f+1]:=d[101-l];
end;
end;

// проверка на совпадения, у меня все норм
procedure TForm1.Button2Click(Sender: TObject);
var
  z,x:integer;
begin
for z:=0 to 98 do
  for x:= 1+z to 99 do
    if Memo1.Lines[z]=Memo1.Lines[x] then  Edit1.Text:='false';
end;
VirusN13
ArtGrek вне форума Ответить с цитированием
Старый 15.12.2010, 14:01   #19
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

код от Stilet
Код:
procedure TForm1.Button5Click(Sender: TObject);
var
  v: integer;
begin
  Memo1.Lines.Clear;
  randomize;
  for v:= 1 to 100 do  Memo1.Lines.Add(Inttostr(v));
  for v:= 1 to 100 do  Memo1.Lines.Exchange(random(100),random(100));
end;
VirusN13
ArtGrek вне форума Ответить с цитированием
Старый 15.12.2010, 14:08   #20
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

Ух, сколько способов перепробовали. Вот, еще хочу предложить "идиотский" способ с помощью обычного стринглиста. Раз он работает, значит имеет право на существование
Код:
procedure TForm1.RzBitBtn1Click(Sender: TObject);
var sl: TStringList; i: Integer; s: string;
begin
  sl := TStringList.Create;
  Randomize;
  for i := 0 to 99 do
  {добавим "от балды" любые числа плюс через звездочку номер записи +1}
    sl.Add(IntToStr(RandomRange(-9999, 9999)) + '*' + inttostr(i + 1));
  {Теперь отсортируем стринглист по этим числам}
  sl.sort;
  {А теперь заберём номер записи после звездочки}
  for i := 0 to sl.Count - 1 do
    s := s + ' ' + copy(sl[i], Pos('*', sl[i]) + 1, Length(sl[i]));
  ShowMessage(s);
  sl.Free;
end;
Ясен перец, что нам нужна не строка, а число, но преобразовать не проблема.
_SERGEYX_ вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как к числу прибавить проценты 90 + 10% и получить 100. а не 99. il_il Microsoft Office Excel 30 21.07.2012 02:42
Числа в порядке убывания skiffter Общие вопросы C/C++ 10 14.09.2010 15:34
Вывести числа в обратном порядке asmcc Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 14 20.02.2010 11:46
вводим два числа, получить все меньшие n натуральные числа, квадрат суммы цифр которых равен m Sparky Помощь студентам 2 22.11.2009 21:59
Числа от 1 до 100 и обратно Винни пух JavaScript, Ajax 6 05.05.2009 17:22