![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Случайное число без повторов
AIK © (2008-11-26 10:49:00)Здравствуйте никто не даст идею как Проше и лучше реализовать такое, а то я ЗАМУТИЛ что-то очень большое и некрасивое, другое пока в голову не приходит :-(
……
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;
AIK (2008-11-26 15:36:00) [1]
> MBo © (26.11.08 15:15) [16]
Спасибо, вариант на много проше.
MBo (2008-11-26 15:15:00) [2]так тебе перемешивание нужно, похоже. Тогда ни к чему два списка
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:08:00) [3]
> ужас. StringList-то зачем?
в моем случаи нужно с ним работать легче
> Palladin © (26.11.08 15:05) [14]
> st.Free; // что за невежество, не освобождать память?
Виноват
Palladin (2008-11-26 15:05:00) [4]
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;
Ega23 (2008-11-26 15:00:00) [5]
> Сделал так, вроде нормально серьезно
ужас. StringList-то зачем?
AIK (2008-11-26 14:55:00) [6]Сделал так, вроде нормально серьезно
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. No RepRandom - Это типа repeat, чтоб не придирались :о)
Anatoly Podgoretsky (2008-11-26 13:12:00) [7]Сделай массив 0..10, последний индекс не используй.
9899100 (2008-11-26 11:44:00) [8]
> > Компилятор выдал: [Error] Unit1.pas(62): Sets may have
> at most 256 elements
> >Компилятор выдал: [Error] Unit1.pas(69): Incompatible types
>
> я думаю, Игорю больно слышать )
>
> заполняешь любой удобный контейнер числами по порядку, получаешь
> его элемент по случайному индексу, удаляешь этот элемент
> из контейнера
Абсолютно нормально
яж написал
> примерно так
> Var mn:set of Integer;
а не используй этот код :)
AIK (2008-11-26 11:28:00) [9]
> Palladin © (26.11.08 11:18) [7]
Ах да... хороший вариант спасибо за идею
> MBo © (26.11.08 11:18) [8]
И тебе спасибо, но идея выше немного по проше хоть и почти похожи
MBo (2008-11-26 11:18:00) [10]Заполнить массив [0..N - 1] последовательными числами.
Для получения K-го случайного числа брать элемент массива с индексом Random(N-K+1), затем ставить на его место элемент [N-K]
Palladin (2008-11-26 11:18:00) [11]
> Компилятор выдал: [Error] Unit1.pas(62): Sets may have at most 256 elements
>Компилятор выдал: [Error] Unit1.pas(69): Incompatible types
я думаю, Игорю больно слышать )
заполняешь любой удобный контейнер числами по порядку, получаешь его элемент по случайному индексу, удаляешь этот элемент из контейнера
Ega23 (2008-11-26 11:18:00) [12]
> Точнее что это такое я понял но это ведь не то что нужно
А ты прочитай свой пост с точки зрения стороннего человека и попытайся понять, что тебе нужно.
Я так понял, что тебе нужно упорядоченный массив от 0 до 9 "перемешать".
Вопрос: а зачем? Не проще ли брать случайный элемент упорядоченного массива?
AIK (2008-11-26 11:15:00) [13]
> AIK © (26.11.08 11:12) [4]
> > Ega23 © (26.11.08 10:51) [1]Че это такое?
Точнее что это такое я понял но это ведь не то что нужно
AIK (2008-11-26 11:12:00) [14]
> 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
9899100 (2008-11-26 10:57:00) [15]попробуй с множествами поработать
при генерации числа добавляй его в множество
примерно так
Var mn:set of Integer;
...
repeat
x:=Random(11);
until not (x in mn);
mn:=mn + x;
stas (2008-11-26 10:53:00) [16]Если используешь memo, то зачем еще масив выдумывать
используй
memo1.Lines.IndexOf()
Ega23 (2008-11-26 10:51:00) [17]гм...
Без повторов - элементарно.
for i:=Low(X) to High(X) do X[i] := i;