Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.01.11;
Скачать: CL | DM;

Вниз

Случайное число без повторов   Найти похожие ветки 

 
AIK ©   (2008-11-26 10:49) [0]

Здравствуйте никто не даст идею как Проше и лучше реализовать такое, а то я ЗАМУТИЛ что-то очень большое и некрасивое, другое пока в голову не приходит :-(

……
var
 Form1: TForm1;
 X: Array[0..9] of integer;
 Z: integer;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
B: Boolean;
y,i: integer;
begin
B:= false;
If z=10 then
exit;

Randomize;
Repeat
Y:= random(11);
For i:=0 to z do
If X[i]= y  then  Begin
  Break; end else
If i= z then begin
  X[z]:= y;
  B:= true;
  Break;
end;
Until b=true;

Memo1.Lines.Add(IntToStr(x[z]));
 Z:=z+1;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 Z:= 0;
end;


 
Ega23 ©   (2008-11-26 10:51) [1]

гм...
Без повторов - элементарно.

for i:=Low(X) to High(X) do X[i] := i;


 
stas ©   (2008-11-26 10:53) [2]

Если используешь memo, то зачем еще масив выдумывать
используй
memo1.Lines.IndexOf()


 
9899100   (2008-11-26 10:57) [3]

попробуй с множествами поработать
при генерации числа добавляй его в множество
примерно так
Var mn:set of Integer;
...
repeat
x:=Random(11);
until not (x in mn);
mn:=mn + x;


 
AIK ©   (2008-11-26 11:12) [4]


> Ega23 ©   (26.11.08 10:51) [1]


Че это такое?


> stas ©   (26.11.08 10:53) [2]


Да я мемо только потом поставил, а переделывать не додумался


> 9899100   (26.11.08 10:57) [3]


Var mn:set of Integer;

Компилятор выдал: [Error] Unit1.pas(62): Sets may have at most 256 elements

Пробовал с Byte
Но
repeat
Y:=Random(10);
until not (Y in mn);
mn:=mn + Y;   //Y: Integer;
Компилятор выдал: [Error] Unit1.pas(69): Incompatible types


 
AIK ©   (2008-11-26 11:15) [5]


> AIK ©   (26.11.08 11:12) [4]
> > Ega23 ©   (26.11.08 10:51) [1]Че это такое?


Точнее что это такое я понял но это ведь не то что нужно


 
Ega23 ©   (2008-11-26 11:18) [6]


> Точнее что это такое я понял но это ведь не то что нужно


А ты прочитай свой пост с точки зрения стороннего человека и попытайся понять, что тебе нужно.
Я так понял, что тебе нужно упорядоченный массив от 0 до 9 "перемешать".
Вопрос: а зачем? Не проще ли брать случайный элемент упорядоченного массива?


 
Palladin ©   (2008-11-26 11:18) [7]


> Компилятор выдал: [Error] Unit1.pas(62): Sets may have at most 256 elements
>Компилятор выдал: [Error] Unit1.pas(69): Incompatible types

я думаю, Игорю больно слышать )

заполняешь любой удобный контейнер числами по порядку, получаешь его элемент по случайному индексу, удаляешь этот элемент из контейнера


 
MBo ©   (2008-11-26 11:18) [8]

Заполнить массив [0..N - 1] последовательными числами.
Для получения K-го случайного числа брать элемент массива с индексом Random(N-K+1), затем ставить на его место элемент [N-K]


 
AIK ©   (2008-11-26 11:28) [9]


> Palladin ©   (26.11.08 11:18) [7]


Ах да... хороший вариант спасибо за идею


> MBo ©   (26.11.08 11:18) [8]


И тебе спасибо, но идея выше немного по проше хоть и почти похожи


 
9899100   (2008-11-26 11:44) [10]


> > Компилятор выдал: [Error] Unit1.pas(62): Sets may have
> at most 256 elements
> >Компилятор выдал: [Error] Unit1.pas(69): Incompatible types
>
> я думаю, Игорю больно слышать )
>
> заполняешь любой удобный контейнер числами по порядку, получаешь
> его элемент по случайному индексу, удаляешь этот элемент
> из контейнера


Абсолютно нормально
яж написал

> примерно так
> Var mn:set of Integer;


а не используй этот код :)


 
Anatoly Podgoretsky ©   (2008-11-26 13:12) [11]

Сделай массив 0..10, последний индекс не используй.


 
AIK ©   (2008-11-26 14:55) [12]

Сделал так, вроде нормально серьезно

procedure NoRepRandom(Max1: Integer; Max2: TStringList);
var
 I, x: integer;
 St: TStringList;
Begin
St:= TStringList.Create;
 For i:=0  to max1 do
   St.Add(Inttostr(i+1));  // типа не от 0
Randomize;
While Max1<>0 do
 Begin
   x:= Random(Max1);
   Max2.Add(st[X]);
   st.Delete(X);
   Max1:= max1-1;
 end;
end;


P.S.  NoRepRandom  - Это типа repeat, чтоб не придирались :о)


 
Ega23 ©   (2008-11-26 15:00) [13]


> Сделал так, вроде нормально серьезно


ужас. StringList-то зачем?


 
Palladin ©   (2008-11-26 15:05) [14]

procedure NoRepRandom(Max1: Integer; Max2: TList);
var
 I, x: integer;
 St: TList;
Begin
 St:= TList.Create;
 Try
  For i:=0  to max1 do St.Add(Pointer(i));  // типа не от 0, а почему бы и нет?
  Randomize;
  While st.Count>0 do
   Begin
    x:= Random(st.Count);
    Max2.Add(st[X]);
    st.Delete(X);
   end;
 Finally
  st.Free; // что за невежество, не освобождать память?
 End;
end;


 
AIK ©   (2008-11-26 15:08) [15]


> ужас. StringList-то зачем?


в моем случаи нужно с ним работать легче


> Palladin ©   (26.11.08 15:05) [14]
>  st.Free; // что за невежество, не освобождать память?


Виноват


 
MBo ©   (2008-11-26 15:15) [16]

так тебе перемешивание нужно, похоже. Тогда ни к чему два списка

 for i := 0 to N - 1 do
   A[i] := i + 1;
 for i := N - 1 downto 0 do begin
   temp := A[i];
   j := Random(i + 1);
   A[i] := A[j];
   A[j] := temp;
 end;


 
AIK ©   (2008-11-26 15:36) [17]


> MBo ©   (26.11.08 15:15) [16]


Спасибо, вариант на много проше.



Страницы: 1 вся ветка

Текущий архив: 2009.01.11;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.017 c
3-1212609046
Jeqa
2008-06-04 23:50
2009.01.11
получить остаток на основании накладных


1-1205380631
snake-as
2008-03-13 06:57
2009.01.11
Посылка письма


15-1226277137
Abcdef123
2008-11-10 03:32
2009.01.11
Верно ли это?


1-1205823627
denmin
2008-03-18 10:00
2009.01.11
Как передать значения из DLL в приложение?


1-1205387717
Maxick
2008-03-13 08:55
2009.01.11
TIBataBase и DLL