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

Вниз

список из случайных неповторяющихся чисел   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.02 c
15-1249325284
oldman
2009-08-03 22:48
2009.10.04
Да ну вас всех два


2-1249339340
bag
2009-08-04 02:42
2009.10.04
Помогите с if... then


2-1248439205
bsv
2009-07-24 16:40
2009.10.04
список листов в книге excel


2-1249378085
Kolan
2009-08-04 13:28
2009.10.04
Почему вместо &amp;#8593; отображается квадратик


2-1248696896
LoveTT
2009-07-27 16:14
2009.10.04
Интерпретация символов самописным браузером