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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.12.2010, 23:34   #1
Coder01
Пользователь
 
Регистрация: 22.08.2010
Сообщений: 16
По умолчанию В хаотическом порядке получить числа 1-100

Здравствуйте. Помогите пожалуйста. Нужно получить числа от 1 до 100 в хаотическом порядке, так чтобы они не повторялись... Тоесть в итоге должно быть 100 чисел, но ниодно из них не должно повторяться...Это как то в рандом реализуется?
Coder01 вне форума Ответить с цитированием
Старый 14.12.2010, 23:46   #2
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

Код:
procedure Shuffle(var aArray; aItemCount: Integer; aItemSize: Integer);
var Inx: Integer;
  RandInx: Integer;
  SwapItem: PByteArray;
  A: TByteArray absolute aArray;
begin
  if (aItemCount > 1) then
  begin
    GetMem(SwapItem, aItemSize);
    try
      for Inx := 0 to (aItemCount - 2) do
      begin
        RandInx := Random(aItemCount - Inx);
        Move(A[Inx * aItemSize], SwapItem^, aItemSize);
        Move(A[RandInx * aItemSize], A[Inx * aItemSize], aItemSize);
        Move(SwapItem^, A[RandInx * aItemSize], aItemSize);
      end;
    finally
      FreeMem(SwapItem, aItemSize);
    end;
  end;
end;

//*****Ну, и клик по кнопке**********

procedure TForm1.Button2Click(Sender: TObject);
var a: array[1..100] of Integer;
  i: Shortint; s: string;
begin
  Randomize;
  for i := Low(a) to High(a) do
    a[i] := i;
  Shuffle(a, High(a), SizeOf(Integer));
  for i := 1 to High(a) - 1 do
    s:= s+' '+(IntToStr(a[i]));
    ShowMessage(s);
end;
_SERGEYX_ вне форума Ответить с цитированием
Старый 14.12.2010, 23:58   #3
Coder01
Пользователь
 
Регистрация: 22.08.2010
Сообщений: 16
По умолчанию

А почему он выдает всегда 99 на 1 или 2ое место?
Кстати если не трудно подскажите почему у меня не получается:
Код:
for i:=1 to 100 do
begin
  randomize;
  a[i]:=RandomRange(0,100);
  for j:=1 to 100 do
  begin
    if a[i]<>a[j] then memo1.lines.add(strtoint(a[i]));
  end;
end;
Coder01 вне форума Ответить с цитированием
Старый 15.12.2010, 01:07   #4
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

вот

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  i, j: integer;
  a: byte;
  b: boolean;
begin
  b:=true;
  for i:=1 to 100 do
  begin
    repeat
      a:=random(100);
      for j:=1 to i do
        if IntToStr(a)=Memo1.Lines[j] then b:=false
          else b:=true;
    until b;
    Memo1.Lines.Add(IntToStr(i)+'-'+IntToStr(a));
  end;
end;
VirusN13
ArtGrek вне форума Ответить с цитированием
Старый 15.12.2010, 01:08   #5
Genco
Пользователь
 
Аватар для Genco
 
Регистрация: 16.11.2010
Сообщений: 46
По умолчанию

Цитата:
Кстати если не трудно подскажите почему у меня не получается:
randomize нельзя в цикл потому что. А ещё потому что надо While в твоей логике. Да и вообще, при почти заполненном массиве программа будет долго гадать, какого числа ещё не было, плохой это способ.
2 ArtGrek - то же самое.

2 _SERGEYX_: А можно пояснить в 2х словах, как именно перестановки памяти эти работают?
Бложегов не имею, но найти меня можно в уютном междусобойчике тут: http://coverduck.ru
"Форум программистов, анархистов, анонимусов и просто любителей с интересом пообщаться"

Последний раз редактировалось Genco; 15.12.2010 в 01:10. Причина: Ремарка
Genco вне форума Ответить с цитированием
Старый 15.12.2010, 01:20   #6
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

сорри поправочка

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  i, j: integer;
  a: byte;
  b: boolean;
begin
  b:=true;
  for i:=1 to 100 do
  begin
    repeat
      a:=random(100);
      for j:=1 to i do
        if IntToStr(a)=Memo1.Lines[j] then
        begin 
          b:=false;
          break;
        end
        else b:=true;
    until b;
    Memo1.Lines.Add(IntToStr(i)+'-'+IntToStr(a));
  end;
end;
Цитата:
А ещё потому что надо While в твоей логике.
как например?
VirusN13

Последний раз редактировалось Stilet; 15.12.2010 в 10:29.
ArtGrek вне форума Ответить с цитированием
Старый 15.12.2010, 01:49   #7
Genco
Пользователь
 
Аватар для Genco
 
Регистрация: 16.11.2010
Сообщений: 46
По умолчанию

Не поленись - скопируй к себе и запусти))
1) IntToStr(a)=Memo1.Lines[j] - проверка не выполняется, ты данные добавляешь ниже через дефис, всегда False тут
2) алгоритм неоптимален, повторяю: последние числа значительно дольше подбираются,если проверку правильную поставить. Потому что компьютер угадывает 2-3 "нужных" числа из 100. _SERGEYX_ вообще полностью соптимизированный под память вариант привел, хотя и немного крутоватый)

Нужен список/набор элементов от 1 до 100: выбрать случайный,потом удалить из рассмотрения. И так 100 раз.

//------------
repeat тоже подойдет,да, я про это.
Ща мб гляну у себя искомую идею,в кривом варианте

Это в общих чертах пример со списком. Имеет смысл, когда в массиве/наборе что-то посложнее, чем просто целые числа. Только ещё надо использовать TList с указателями, как положено - просто поленился писать посреди ночи, а готового у себя не нашел.
Код:
procedure TForm1.Button2Click(Sender: TObject);
var
 Nlist: TStringList;
 i,k : integer;
begin
 NList:=TStringList.Create;
 for i:=1 to 100 do
  begin
   Nlist.Add(inttostr(i));
  end;
 Memo1.Lines.Clear;
 Randomize;
 while (Nlist.Count>0) do
  begin
   k:=Random(Nlist.Count);
   Memo1.Lines.Add(Nlist[k]);
   Nlist.Delete(k);
  end;
 Nlist.Free;
end;
А вот сильно упрощенная версия того, что было предложено выше.
Код:
procedure TForm1.Button3Click(Sender: TObject);
var
 i,k,buf:integer;
 mas: array [1..100] of integer;
begin
 //заполнить
 for i:=1 to 100 do mas[i]:=i;
 Randomize;
 //----------перемешать-------------
 for i:=1 to 100 do
  begin
   k:=RandomRange(i+1,100);
   buf:=mas[i];
   mas[i]:=mas[k];
   mas[k]:=buf;
  end;
 //-------------вывести-------------
 Memo1.Lines.Clear;
 for i:=1 to 100 do
  begin
   Memo1.Lines.Add(inttostr(mas[i]));
  end;
end;
Бложегов не имею, но найти меня можно в уютном междусобойчике тут: http://coverduck.ru
"Форум программистов, анархистов, анонимусов и просто любителей с интересом пообщаться"

Последний раз редактировалось Stilet; 15.12.2010 в 10:39.
Genco вне форума Ответить с цитированием
Старый 15.12.2010, 02:45   #8
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

Цитата:
1) IntToStr(a)=Memo1.Lines[j] - проверка не выполняется, ты данные добавляешь ниже через дефис, всегда False тут
пуст тогда будет
Код:
Memo1.Lines.Add(IntToStr(a));
или так

Код:
procedure TForm1.Button3Click(Sender: TObject);
var
  l,p:integer;
  f:byte;
  d: array [0..99] of byte;
begin
for p:= 0 to 99 do
  d[p]:=p;
for l:= 0 to 99 do
begin
  f:=random(100-l);
  Memo1.Lines.Add(Inttostr(d[f]));
  d[f]:=d[100-l];
end;
end;
VirusN13
ArtGrek вне форума Ответить с цитированием
Старый 15.12.2010, 07:02   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от ArtGrek
Код:
for l:= 0 to 99 do
begin
  f:=random(100-l);
  Memo1.Lines.Add(Inttostr(d[f]));  d[f]:=d[100-l];
end;
идея хорошая. но так нельзя.
На первом же шаге вылет за пределы массива:
чему будет равно 100-l при l=0 ? 100 ?
d[f] := d[100] ? а верхний индекс массива равен 99 - отсюда - range error...

я уже не говорю о такой "мелочи", как то, что вы в массив заносите циферки от нуля до 99, а по условиям задачи требуется от 1 до 100.

короче, последний вариант - явно не зачёт.. но идея, как мне кажется, вполне себе нормальная, при желании можно довести до ума...


А вообще потрясает, как для решения такой простой задачи (кстати, на форуме решалась эта задача многократно) возникает столько вариантов решения и такое бурное обсуждение...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 15.12.2010, 08:27   #10
XerSon
Форумчанин
 
Аватар для XerSon
 
Регистрация: 21.01.2008
Сообщений: 211
По умолчанию

2ArtGrek

вылет за пределы массива: 128
XerSon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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