Entwickler-Ecke

Sonstiges (Delphi) - Zufallstexte nur 1 mal benutzen [Random]


teamrocket0 - Fr 26.01.07 17:58
Titel: Zufallstexte nur 1 mal benutzen [Random]
Moin.

Meine Übung vom letzen mal:
http://www.delphi-forum.de/viewtopic.php?t=69095&highlight=random

hat einen kleinen Bug. Ich habe ein MaskEdit eingebaut mit dem man die Anzahl der Durchläufe einstellen kann. Maximal 99 sind möglich.

Es kann ja vorkommen das aus dem "Random-Bereich" ein Eintrag zwei mal oder öfter aufgelistet wird.

Nur das kann ich leider nicht gebrauchen.
Wie kann ich dafür sorgen das jede Zeile bei einem Arbeitsgang (Also 1- max. 99 Durchlaufe) nur einmal auftritt. Wir gehen mal davon aus das der "Random-Bereich" groß genug ist.

Vielen Dank für einen Hinweiß!


Robinator - Fr 26.01.07 18:02

Du könntest dir nen Array of integer erstellen, in das du eine zahlenfolge von 0..X einträgst. Nun könntest du Per Random(Length(MyArr)) darauf zugreifen und den entsprechenden eintrag danach löschen. So kann jeder Wert nur einmal vorkommen.

Gruss, rob


teamrocket0 - Fr 26.01.07 18:06

Bohr.

Kling Hammer komplieziert.
Ich hätte mir jetzt einfach mal 99 Variablen erstellt und mit einer Zählschleife immer eine Variable nach der anderen mit dem Randomwert beschrieben und danach abgefrag ob der neue Randomwert irgendwo einaml in einer Variable auftaucht!


Robinator - Fr 26.01.07 18:16


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
Procedure CreateRandomBla;
var
  MyArr : Array of Integer;
  RandArr : Array[0..X] of Integer;
  i, ind : integer;
  Procedure Delete(Index : integer);
  var
   i : integer;
  begin
    for i := index to Length(MyArr) - 2 do
      MyArr[i] := MyArr[i + 1];
    SetLength(MyArr, Length(MyArr) - 1);
  end;
begin
  SetLength(MyArr, X + 1);
  for i := 0 to X do
    MyArr[i] := i;
  for i := 0 to X do 
  begin
    ind := Random(Length(MyArr));
    RandArr[i] := MyArr[ind];
    Delete(ind);
  end;
end;


So, das is doch garnicht alzu kompliziert - hab das jetzt mal eben hier reingetippselt, ist also nicht getestet. Sollte aber so, oder mit kleinen modifikationen laufen. (X musst du natürlich mit der Gewünschten Anzahl ersetzen.)

gruss, rob


Narses - Sa 27.01.07 00:58

Moin!

Der Vollständigkeit halber: Zufallszahlen im Bereich von x..y erzeugen geht am besten so: ;)
  1. Die Zahlen in ein Array eintragen:

    Delphi-Quelltext
    1:
    2:
    for i := x to y do
      Feld[i] := i;

  2. Das Feld nach Suche in: Delphi-Forum, Delphi-Library MILLER YATES "durchschütteln". ;)

cu
Narses


alzaimar - Sa 27.01.07 09:55

Narses, ich glaube, er möchte N eindeutige Zufallszahlen aus dem Bereich 0..M, wobei M>=N. Insofern ist der Code Robinator im Prinzip zu gebrauchen.


Narses - Sa 27.01.07 17:15

Moin!

Hmm... :? nach erneutem Drübersehen scheint mir das auch so... :| Also, bischen schnell mit meinem Vorschlag gewesen... ;)

cu
Narses