Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi stringgrid (https://www.delphipraxis.net/114998-stringgrid.html)

matze222 4. Jun 2008 07:31


stringgrid
 
ich hab ein stringgrid mit 10x10 kästchen erzeugt und habe nun vor dort zufällig die zahlen 1 bis 100 einzuschreiben...
ich bin soweit das ich in jedem feld eine zahl habe, die zahlen zufällig verteilt sind nur soll jede zahl nur einmal vorkommen... und da scheiterts bei mir!

mein quellcode is noch sehr übersichtlich:
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
begin
        randomize;
        zahl1:=random(99)+1;
        zahl2:=random(10);
        zahl3:=random(10);

        stringgrid1.cells[zahl2,zahl3]:=inttostr(zahl1);
        stringgrid1.Selection:=Tgridrect(rect(-1,-1,-1,-1));
end;

end.

mkinzler 4. Jun 2008 07:34

Re: stringgrid
 
Erzeuge eine Liste mit den 100 Zahlen, vermische diese und übertrage sie in das Grid

DeddyH 4. Jun 2008 07:36

Re: stringgrid
 
Spontane Idee: definiere Dir eine Menge der möglichen Zahlen. Nun ermittelst Du solange eine Zufallszahl, bis diese in der Menge vorkommt. Anschließend entfernst Du diese aus der Menge und ermittelst die nächste Zufallszahl.

matze222 4. Jun 2008 07:37

Re: stringgrid
 
und wie mach ich das?

mkinzler 4. Jun 2008 07:41

Re: stringgrid
 
Delphi-Quellcode:
for i := 1 to 100 do zahlen[i] := i;

for i := 1 to 50 do
begin
    z1 := Random(99) + 1;
    z2 := Random(99) + 1;
    h := zahlen[z1];
    zahlen[z1] := z2;
    zahlen[z1] := h;
end;

Luckie 4. Jun 2008 08:10

Re: stringgrid
 
Man könnte auch eine Liste mit den Zahlen 1 bis 100 erzeugen (sortiert) und diese dann mit einem Algorithmus (müsste hier im Forum zu finden sein) mischen. Wenn ich nachher etwas Zeit finde mache ich das mal eben schnell.

mkinzler 4. Jun 2008 08:13

Re: stringgrid
 
Zitat:

Zitat von Luckie
Man könnte auch eine Liste mit den Zahlen 1 bis 100 erzeugen (sortiert) und diese dann mit einem Algorithmus (müsste hier im Forum zu finden sein) mischen. Wenn ich nachher etwas Zeit finde mache ich das mal eben schnell.

Das war mein Vorschlag und einen einfachen Mischalgorithmus findest du unter #5

DeddyH 4. Jun 2008 08:20

Re: stringgrid
 
Müsste das übrigens nicht
Delphi-Quellcode:
Random(100) + 1
heißen?

Sharky 4. Jun 2008 08:44

Re: stringgrid
 
Hai matze222,

gebe deinem Thread doch bitte auch noch einen Titel aus dem man auf das Problem schliessen kann. ;-)

Danke.

taaktaak 4. Jun 2008 08:45

Re: stringgrid
 
Moin, Moin,

mir kommt da noch etwas anderes seltsam vor:

Delphi-Quellcode:
h := zahlen[z1];
zahlen[z1] := z2;
zahlen[z1] := h;
Sollte es vielleicht so gedacht sein?

Delphi-Quellcode:
h := zahlen[z1];
zahlen[z1] := zahlen[z2];
zahlen[z2] := h;

mkinzler 4. Jun 2008 18:34

Re: stringgrid
 
Zitat:

Zitat von taaktaak
Moin, Moin,

mir kommt da noch etwas anderes seltsam vor:

Delphi-Quellcode:
h := zahlen[z1];
zahlen[z1] := z2;
zahlen[z1] := h;
Sollte es vielleicht so gedacht sein?

Delphi-Quellcode:
h := zahlen[z1];
zahlen[z1] := zahlen[z2];
zahlen[z2] := h;

Natürlich :oops: :oops: :oops: :oops: :oops: :oops: :oops: :oops: :oops:

taaktaak 4. Jun 2008 19:44

Re: stringgrid
 
Don't worry!

Im Eifer des Gefechts kann das schon mal passieren. Hatte mir heute morgen mal das Ergebnis angeschaut: Der Algorithmus scheint mir nicht besonders effektiv.

Ein Blick in meinen Fundus brachte dann eine fast identische Procedur zum Vorschein, in der ich nur einen Index über Random() bestimme, der zweite Index wird einfach nur über den Schleifenzähler bereitgestellt. Der Geschwindigkeitsvorteil wird aber vermutlich nicht ins Gewicht fallen. Das Ergebnis ist mit der hier vorgestellten Prozedur vergleichbar.

Ich denke, wenn eine "gute" Mischung wichtig ist, dann müsste man noch einen anderen Weg gehen...

bluesbear 4. Jun 2008 20:01

Re: stringgrid
 
Also effektiv ist er, wenn man mal die Tippfehler vernachlässigt.
Ist er auch effizient? Ich glaube, das spielt bei der Anwendung keine Rolle. Wildes Vertauschen klappt immer <g>.

taaktaak 4. Jun 2008 20:08

Re: stringgrid
 
Hmmm, meine Stichproben haben ergeben, dass manchmal mehrere Zahlenwerte (wieder?) in der ursprünglichen Reihenfolge standen. Nun war ja nicht die Rede davon, dass dies ausgeschlossen werden muss. Aber von einer guten Verwürfelung möchte ich eigentlich erwarten, dass die ursprüngliche Reihenfolge nicht gleich in mehreren Fällen beibehalten wird - oder ist meine Erwartung falsch?

Noobinator 5. Jun 2008 13:26

Re: stringgrid
 
gerade abgetippt:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var Zahlen:set of Byte;
    rand,i,j:integer;
begin
randomize; //Zufallsgenerator initialisieren
Zahlen := []; //leere Menge anlegen

for i := 0 to 9 do //Zeilen und Spalten durchgehen
  for j := 0 to 9 do
    begin
      rand := random(100) + 1; //zufallszahl suchen
       while rand in Zahlen do //schauen ob schon vorhanden, wenn ja neue
           rand := random(100) + 1;
       include(zahlen,rand); //hinzufügen zu bereits benutzen Zahlen
       stringgrid1.Cells[i,j] := IntToStr(rand); //reinschreiben
    end;
end;
Achtung: Las Vegas Algo - Laufzeit nicht gesichert.

DeddyH 5. Jun 2008 13:28

Re: stringgrid
 
Das kommt mir irgendwie bekannt vor :lol: .

Noobinator 5. Jun 2008 13:31

Re: stringgrid
 
Zitat:

Zitat von DeddyH
Das kommt mir irgendwie bekannt vor :lol: .

OT: :P


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:29 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz