Форум: "Начинающим";
Текущий архив: 2009.10.04;
Скачать: [xml.tar.bz2];
Внизсписок из случайных неповторяющихся чисел Найти похожие ветки
← →
bag (2009-08-02 17:23) [0]Поставил задачу, получить список из случайных не повторяющихся чисел.
Вот что получилось, вроде работает, но один раз из 10-15 получается список с двумя одинаковыми четверками, что за бред не пойму. Помогите плиз разобраться!var
i, ran1, ran2: integer;
bo: Boolean;
list: TStringList;
begin
list := TStringList.Create;
Randomize;
list.Clear;
for i := 0 to 3 do
begin
ran2 := Random(12) + 1;
bo := false;
if list.IndexOf(IntToStr(ran2)) = -1 then
list.Add(IntToStr(ran2))
else begin
repeat
ran1 := Random(12) + 1;
bo := true;
until (list.IndexOf(IntToStr(ran1)) = -1);
if bo then
list.Add(IntToStr(ran1));
end;
end;
lst2.Clear;
SortList(list);
lst2.Items.AddStrings(list);
list.Free;
← →
Palladin © (2009-08-02 17:33) [1]
> list.Clear;
Зачем?
← →
bag (2009-08-02 17:35) [2]это, да лишнее, привиденный кусок кода я вытащил из большего
← →
Palladin © (2009-08-02 17:38) [3]подход прост, создать список используемых значений и вытаскивать из него по рандомным индексам и тут же удалять.
← →
bag (2009-08-02 17:44) [4]ничего не понял :(
начиная с создания списка используемых значений
← →
bag (2009-08-02 17:59) [5]мне надо получить 4 случайных числа, random(12)
← →
Сергей М. © (2009-08-02 18:09) [6]
> надо получить 4 случайных числа, random(12)
procedure TForm1.Button4Click(Sender: TObject);
var
Ranges: TList;
NumCount, NextNumber, MinNumber, MaxNumber, RngFrom, RngTo: Word;
CurRange: DWord;
ri: Integer;
begin
Ranges := TList.Create;
MinNumber := 0;
MaxNumber := 11;
NumCount := 4;
Ranges.Add(Pointer(MakeLong(MinNumber, MaxNumber)));
Randomize;
while (NumCount > 0) and (Ranges.Count > 0) do begin
ri := Random(Ranges.Count);
CurRange := DWord(Ranges[ri]);
RngFrom := LoWord(CurRange);
RngTo := HiWord(CurRange);
NextNumber := Random(RngTo - RngFrom) + RngFrom;
if (NextNumber > RngFrom) and (NextNumber < RngTo) then begin
Ranges[ri] := Pointer(MakeLong(RngFrom, Pred(NextNumber)));
Ranges.Add(Pointer(MakeLong(Succ(NextNumber), RngTo)));
end else if (NextNumber = RngFrom) and (NextNumber = RngTo) then
Ranges.Delete(ri)
else if (NextNumber = RngFrom) then
Ranges[ri] := Pointer(MakeLong(Succ(RngFrom), RngTo))
else if (NextNumber = RngTo) then
Ranges[ri] := Pointer(MakeLong(RngFrom, Pred(RngTo)));
Memo.Lines.Add(IntToStr(NextNumber));
Dec(NumCount);
end;
end;
← →
bag (2009-08-02 18:27) [7]Сергей М, огромное человеческое спасибо, очень помогли мне! вижу что вам это самому интересно было:)
← →
Сергей М. © (2009-08-02 18:29) [8]
> bag (02.08.09 18:27) [7]
Не за что.
Посто заготовка под рукой оказалась.
← →
Юрий Зотов © (2009-08-02 18:50) [9]Чет как-то слишком наворочено для такой простой задачки...
var
Numbers: set of byte = [];
procedure TForm1.FormCreate(Sender: TObject);
var
Count: integer;
N: byte;
begin
Randomize;
Count := 1;
while Count < 5 do
begin
N := Random(12);
while N in Numbers do
N := Random(12);
Include(Numbers, N);
Inc(Count)
end
end;
← →
Anatoly Podgoretsky © (2009-08-02 18:56) [10]> bag (02.08.2009 18:27:07) [7]
Вряд ли, вопрос просто обсосан до костей, какой уж интерес.
← →
bag (2009-08-02 19:05) [11]Юрий Зотов, спасибо!
Спасибо и тебе Anatoly Podgoretsky, за часто ненужные комметарии:)))
← →
Сергей М. © (2009-08-02 19:06) [12]
> Юрий Зотов © (02.08.09 18:50) [9]
А завтра автор развернет оглобли и захочет получить, скажем, все числа в рандомной последовательности из диапазона set of Word.. или set of DWord ..
← →
Сергей М. © (2009-08-02 19:07) [13]
> Anatoly Podgoretsky, за часто ненужные комметарии
Но здесь, кстати и к счастью, оч даже уместные
← →
Юрий Зотов © (2009-08-02 19:42) [14]> Сергей М. © (02.08.09 19:06) [12]
И хорошо. Заодно и узнает, что такое Set...
:o)
← →
Сергей М. © (2009-08-02 19:48) [15]
> Юрий Зотов © (02.08.09 19:42) [14]
Тоже верно, спору нет)
← →
Leonid Troyanovsky © (2009-08-03 12:46) [16]
> bag (02.08.09 17:59) [5]
> мне надо получить 4 случайных числа, random(12)
function RandEx(const a, b: Longint; const excludes: array of Longint):Longint;
var
i, m : Longint;
begin
m := High(excludes);
Assert(m >= 0, "Invalid param: excludes");
Result := a + Random(b-a-m);
for i := 0 to m do
if (Result >= excludes[i]) then
inc(Result)
else
Break;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
e: array [0..3] of Longint;
cnt, i, j, v : Longint;
begin
e[0] := 1 + Random(12);
cnt := 1;
for i := 1 to 3 do
begin
e[i] := RandEx(1, 12, Slice(e, cnt));
for j := cnt downto 1 do
begin
if (e[j] < e[j-1]) then
begin
v := e[j];
e[j] := e[j-1];
e[j-1] := v;
end;
end;
inc(cnt);
end;
for j := 0 to cnt-1 do
with StringGrid1 do
Cells[0, e[j]] := IntToStr(StrToInt(Cells[0, e[j]])+1);
end;
--
Regards, LVT.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2009.10.04;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.085 c