Форум: "Начинающим";
Текущий архив: 2009.01.11;
Скачать: [xml.tar.bz2];
ВнизСлучайное число без повторов Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.005 c