Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Problem in Pascal! (https://www.delphipraxis.net/15699-problem-pascal.html)

Sofa5000 2. Feb 2004 19:46


Problem in Pascal!
 
Ich habe diesen Pascal Code:

Delphi-Quellcode:
var i,j:integer;
    zahl:array[1..n,1..n]of integer;
begin
     randomize;
     for i:=1 to n do
         for j:=1 to n do
             zahl[i,j]:=random(9)+1;
Jetzt werden Zufallszahlen in diesen Zweidimensionalen Array geschrieben. Aber es sollen keine zahlen doppelt vorkommen. Wie kann ich es machen dass immer verschieden Zahlen in diesem Array stehen?

Danke!

Chewie 2. Feb 2004 19:50

Re: Problem in Pascal!
 
Du musst prüfen, ob diese spezifische Zahl bereits erstellt wurde.

Da du nur 9 mögliche Zahlen hast, bietet sich an, ein Array[1..10] of Boolean zu benutzen, in dem du für jede Zahl angibst, ob sie bereits erzeugt wurde oder nicht.

MikeS 2. Feb 2004 19:56

Re: Problem in Pascal!
 
Delphi-Quellcode:
procedure TForm6.code_erzeugen;
var zahl: array [1..4] of integer;
    i, iZahl, iCount : integer;
    fExists : boolean;

begin
        randomize;
        for i := 1 to 4 do zahl[i] := 0;
        iCount := 4;
        while iCount > 0 do begin
          iZahl  := Random(6)+11;
          fExists := false;
          for i := 1 to 4 do begin
            if zahl[i] = iZahl then begin
              fExists := true;
              break;
            end;
          end;
          if not fExists then begin
            zahl[iCount] := iZahl;
            dec(iCount);
          end;
        end;
end;
versuche es mal damit! ist ein vorschlag von Christian Seehase soweit ich mich erinnere!

Neg 2. Feb 2004 20:32

Re: Problem in Pascal!
 
Delphi-Quellcode:
var
  i, j, rnd: integer;
  Zahl: Array[1..n, 1..n] of integer;
  SchonVerwendet: Set of integer;

begin
  SchonVerwendet:=[];

  for i:=1 to n do
    for j:=1 to n do
    begin
      repeat
        rnd:=Random(9)+1;
      until not (rnd in SchonVerwendet);

      Include(SchonVerwendet, rnd);
      Zahl[i,j]:=rnd;
    end;
end;
Pass aber auf, dass n*n <= 9, sonst hängt der Algorithmus in einer endlosen Schleife. Logisch.

negaH 2. Feb 2004 21:01

Re: Problem in Pascal!
 
Vielleicht hilft dir dieses http://www.delphipraxis.com/topic109...lotto&start=50

Gruß Hagen

choose 3. Feb 2004 08:06

Re: Problem in Pascal!
 
Hallo Neg,

so elegant der Weg mit dem Mengen-Konstrukt auch scheint, so wenig lässt sich in der von Delphi vorgenommenen Implementierung die Deklaration
Delphi-Quellcode:
var
  SchonVerwendet: Set of integer;
compilieren.

Hintergrund: Bei einem Set wird für jedes mögliche Element genau ein Bit gehalten, so dass bei einem
Delphi-Quellcode:
set of Byte
insgesamt 256 Bits abgelegt werden müssen. Im gegensatz zu ausgerichteten Feldern wir einem Array oder einem Record setzt der Delphi-Compilier die Struktur jedoch gepackt um, so dass für jeweils 8 Bits genau ein Byte verwendet werden kann, die Gesamtstrukur belegt daher für n mögliche Elemente den Speicherplatz
Code:
s = (n+7) div 8
(das +7, um gauß'sche Klammern zu sparen) oder in mit dem Exponenten q zur Basis 2 ausgedrückt mit
Code:
q = ln2(n)
gilt daher
Code:
s=2^(ln2(n)-3)
Das bedeutete für den Speicherverbrauch s eines
Delphi-Quellcode:
set of Integer
mit q=32 folglich
Code:
s = 2^29 = 536870912
was also in dem Platzverbrauch von 512MB auf dem Stack entspräche...

Neg 3. Feb 2004 12:05

Re: Problem in Pascal!
 
Oha. Wusste ich noch gar nicht, dass Sets so implementiert sind. Dann kann das natürlich nicht klappen, stimmt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:36 Uhr.

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