[Delphi] Losowy generator bez powtórzeń

0

Witam
Chciałbym stworzyć losowy generator bez powtórzeń z zakresu 1-120.
jak zmodyfikować:
...
random(120)+1;
...
aby wykonywało powyższe zadanie
Pozdrawiam

0

Ja polecam zapisywac jakos te wyniki jakie juz zostaly wylosowane
np: stworzyc tablice typu boolean i pod indeksem danej liczby wpisywac true gdy juz zostala wylosowana.
var bylo: array [1..120] of boolean;
Dalej zrobic petle sprawdzajaca czy wylosowana liczba juz byla
repeat
a := random(120)+1;
until not bylo[a];
tu wpisanie
bylo[a] := true;
i powinno dzialac
(mam nadzieje ;-) )
Pozdrawiam

0

var
Liczby: array [0.120] of Boolean;
i, j, k: Byte;
begin
for i := 0 to 119) do
Liczby[i] := True;
for l := 0 to IleDoWylosowania-1 do
begin
k := Random(120-l);
while Liczby[i] and j

0

A to mój pomysł
procedure TForm1.FormCreate(Sender: TObject);
var
i: integer;
begin
Randomize;
Lista:=TStringList.Create; //tworzenie listy
for i:=1 to 120 do
Lista.Add(IntToStr(i)); //wypelnienie wartosciami 1-120
end;

procedure TForm1.Button1Click(Sender: TObject);
var
liczba: integer;
begin
if Lista.Count>0 then //jesli lista nie jest pusta
begin
liczba:=Random(Lista.Count); //losowanie pozycji na liscie
Memo1.Lines.Add(Lista[liczba]); //wyswietlenie wylosowanej liczby
Lista.Delete(liczba); //usuniecie wylosowanej liczby z listy
end
else
Memo1.Lines.Add('Koniec listy!!!');

end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Lista.Free;
end;

0

kapuściana alternatywa:

Dane wejściowe:
Kartka papieru z wydrukowanymi w osobnych kolumnach liczbami od 1 do 120
Niszczarka dokumentów
Marysia
Wynik:
Wariacja bez powtórzeń ciągu (1,2,...120)

WARIACJA (kartka_papieru):

  1. Włóż kartkę_papieru do niszczarki
  2. Otrzymane skrawki przełóż do pojemnika
  3. While są jeszcze skrawki w pojemniku
        3.1 Niech Marysia wyciągnie jeden skrawek
        3.2 Zapisz wylosowaną liczbę w notatniku
  4. Stop, wynik=notatnik

a tak poważnie to propozycja pq jest chyba najwydajniejsza, aczkolwiek w pierwszej chwili miałem dokładnie ten sam pomysł co Dryo.

pozdrawiam

0

[Error]: Marysia.dcu not found.

0

propozycja pq jest chyba najwydajniejsza

Niestety jej wydajność zależy od wydajności metody TString.Delete tudzież metody odczytującej TString[liczba]. Ktore sa nieznane :(((

0

może dało by sie funkcje rekurencyjną?

0

No <ort>wąłsnie </ort><ort>p[róbowałem</ort> tu zamieszczonych <ort>fragemntów </ort>w użyciu i guzik z <ort>teog </ort>wychodzi. Dalej losuje z powtórzeniami. W tablice to włożyć? Tylko jak? Przecież w tablicy musiałbym zadeklarować cały zakres (który jest zmienny), a to juz jest kłopotliwe.

// patrz co piszesz, bo Ci się klawisze mylą - ŁF
// ten temat ma ponad półtora roku! - M

0

Interesujące, moja metoda losuje Ci z powtórzeniami?

0

A może coś ze zbiorami ? Wydaje mi sie że są szybsze niż TStringList. Głowna procedura losująca to Button1Click:

type
  TLiczby = 1..120;
  TZbior = set of TLiczby;

var
  Form1: TForm1;
  Zbior : TZbior;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Zbior := [];       //inicjalizacja
  Randomize;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Wylosowana : TLiczby;
begin                 //wylosowanie pojedyńczej liczby
  repeat
    Wylosowana := Random(120) + 1;
  until not (Wylosowana in Zbior);
  Zbior := Zbior + [Wylosowana];
  ListBox1.Items.Add(IntToStr(Wylosowana)); //dla testu gromadzimy wylosowane liczby w ListBox1
end;

procedure TForm1.Button2Click(Sender: TObject);
var
   I : Integer;
begin
  Zbior := [];       //wyzerowanie i wylosowanie 120 liczb
  ListBox1.Items.Clear;
  for I := 0 to 119 do
    Button1.Click;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
  I, J : Integer;   //test czy któraś liczba sie powtarza
begin
  for I := 0 to 119 do
    for J := 0 to 119 do
      if (ListBox1.Items[J] = ListBox1.Items[I]) and (I <> J) then
        ShowMessage('Powtórka');    //nie udało mi sie uzyskać powtórki :)
end;
0

tak czy inaczej gotowe rozwiązanie, i to dużo szybszą metodą, już znajduje się na 4p.

1 użytkowników online, w tym zalogowanych: 0, gości: 1