Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Zufalsgenerator - Zahlen auslassen ? (https://www.delphipraxis.net/32189-zufalsgenerator-zahlen-auslassen.html)

Cyberbob_at_tot 20. Okt 2004 09:24


Zufalsgenerator - Zahlen auslassen ?
 
Guten morgen zusammen
habe da mal ne Frage,
wenn ich aus 10 Zufalszahlen nehme und nach jeder die gezogene Zahl aus dem Pool der 10 nehme.
Also beim zweiten Durchgang eine zufalszahl aus 9 usw.

diese Zahl die entfernt wird kann aber auch mitten drin sein also auch die 5, somit muss aus 10 aber ohne die 5!
Hoffe ich habe es so erklärt das man es versteht!

Habt ihr vorschläge ?

THX

Cyberbob

Dax 20. Okt 2004 09:28

Re: Zufalsgenerator - Zahlen auslassen ?
 
Delphi-Quellcode:
var Used: array[1..10] of Integer; i, x, t: Integer;
begin
  Randomize;
  i := 1;
  while i <> 11 do
  begin
    t := Random(10)+1;
    for x := 1 to i do
      if Used[x] = t then Break;
    if x = i+1 then
    begin
      Used[x] := t;
      Inc(i);
    end;
  end;
end;
Dieser Code füllt dein Array Used mit 10 unterschiedlichen Zahlen zwischen 1 und 10.
Beware: untested.

Cyberbob_at_tot 20. Okt 2004 09:31

Re: Zufalsgenerator - Zahlen auslassen ?
 
Werde ich mal ausprobieren! danke

dazu noch ne Frage : wird die 0 mitgenutzt ?

Dax 20. Okt 2004 09:32

Re: Zufalsgenerator - Zahlen auslassen ?
 
Nein. Random(10)+1 produziert Zahlen zwischen 1 und 10, wenn du das +1 wegnimmst, zwischen 0 und 9.

Cyberbob_at_tot 20. Okt 2004 10:00

Re: Zufalsgenerator - Zahlen auslassen ?
 
Habe es nun versucht leider ist es eine entlosschleife. wenn ich mir den Inhalt des Arrays anzeigen lassen will kommt nur eine große Zahle so 328777777 oder so!

Delphi-Quellcode:
Var
V:integer;
Used: array[1..10] of Integer;
i: Integer;
begin
Randomize;
  i := 1;
  Showmessage(inttostr(ID.length));
  while i <> ID.length do
  begin
    zahl:=Random(ID.length)+1;
    for V := 1 to i do
      Showmessage(inttostr(Used[V]));
      if Used[V] = zahl then Break;
      if V = i+1 then begin
                      Used[V] := zahl;
                      Inc(V);
      end;
  end;

Treffnix 20. Okt 2004 10:06

Re: Zufalsgenerator - Zahlen auslassen ?
 
Natürlich ist es eine Endlosschleife. Die Schleife läuft bis i = Id.Length ( <- was ist überhaupt ID ) ist. Du erhöhst aber nirgendwo den Wert von i. Also wird das nie zutreffen. Ausserdem würd ich nicht auf i <> id.length sondern auf i < id.length prüfen.

Dax 20. Okt 2004 10:06

Re: Zufalsgenerator - Zahlen auslassen ?
 
Oh... so stimmts:
Delphi-Quellcode:
var Used: array[1..10] of Integer; i, x, t: Integer;
begin
  Randomize;
  i := 1;
  FillChar(Used[1], 10*sizeof(Uses[1]), 0);
  while i <> 11 do
  begin
    t := Random(10)+1;
    for x := 1 to i do
      if Used[x] = t then Break;
    if x = i+1 then
    begin
      Used[i] := t;
      Inc(i);
    end;
  end;
end;

Cyberbob_at_tot 20. Okt 2004 10:15

Re: Zufalsgenerator - Zahlen auslassen ?
 
ID.length ist die Länge einer Liste.
Er soll also in der LIste zufällig eine Zeile finden! und diese nicht nocheinmal nehmen!

Cyberbob_at_tot 20. Okt 2004 10:31

Re: Zufalsgenerator - Zahlen auslassen ?
 
Habe es nun mit der Verbesserubg ausprobiert aber leider kommen immer noch welche Doppelt!
Bis zur 4ten Stelle passt das Array dann schreib er nix mehr rein!

Soll ich euch das Programm mal hochladen ?

Was ich noch nicht verstehe sind die Zeilen...
FillChar(Used[1], 10, 0);
used[1] := 9;

BIG THX

Dax 20. Okt 2004 10:35

Re: Zufalsgenerator - Zahlen auslassen ?
 
:oops: Wie hat sich denn das 9-Assignement da eingeschlichen?

Aber du musst statt '10' schon die Länge des Arrays angeben, sonst funktionierts nicht.

Das FillChar[...] leert das Array, es wird komplett mit Nullen gefüllt.

Cyberbob_at_tot 20. Okt 2004 10:51

Re: Zufalsgenerator - Zahlen auslassen ?
 
OK das 9te ist weg :-)

Leeren will ich das eigentlich nicht, nach dem ersten Durchgang soll er die Zahl schon behalten bis alle mal dran waren!

Dax 20. Okt 2004 10:54

Re: Zufalsgenerator - Zahlen auslassen ?
 
Dann leerst du das Array eben vor dem ersten Durchgang ... einen passenden Platz für das FillChar zu finden sollte ja nicht schwer sein. ;)

Cyberbob_at_tot 20. Okt 2004 10:55

Re: Zufalsgenerator - Zahlen auslassen ?
 
Liste der Anhänge anzeigen (Anzahl: 2)
Leider funktioniert das mit dem Fillchar nicht richtig !
Siehe Bild!

Dax 20. Okt 2004 10:57

Re: Zufalsgenerator - Zahlen auslassen ?
 
Das verstehe ich nicht... Bei mir funktioniert es reibungslos.

Cyberbob_at_tot 20. Okt 2004 10:58

Re: Zufalsgenerator - Zahlen auslassen ?
 
sorry irgentwie wollte das mit dem Bild nicht richtig ? hoffe es ist nun da!

Dax 20. Okt 2004 11:00

Re: Zufalsgenerator - Zahlen auslassen ?
 
Es ist da, sogar doppelt... :gruebel:

Dax 20. Okt 2004 11:05

Re: Zufalsgenerator - Zahlen auslassen ?
 
Bin heute morgen irgendwie geistig halb-abwesend... Jetzt sollte der Code aber stimmen.
Statt FillChar(Used[1], Len(Used), 0) schreibt man eher FillChar(Used[1], Len(Used)*sizef(Used[1]), 0), dann müsste alles funktionieren.

Cyberbob_at_tot 20. Okt 2004 11:08

Re: Zufalsgenerator - Zahlen auslassen ?
 
Ok habe Fillchar nun direkt am Anfang, dann macht er alle auf 0 nur wieso ?


Nun besteht immer noch das Problem das er mir Trotzdem Doppelte Zahlen angiebt!
Wo kann ich am Besten eine Messagebox einfügen die mir alle zufalszahlen anzeigt!
Habe eine direkt hinter der While schleife, daran lasse ich mir die Zahl aus Random anzeigen!

Cyberbob_at_tot 20. Okt 2004 11:11

Re: Zufalsgenerator - Zahlen auslassen ?
 
Delphi-Quellcode:
FillChar(Used[1], Len(Used)*sizef(Used[1]), 0)
Undefinierter Bezeichner "Len" :(

Dax 20. Okt 2004 11:12

Re: Zufalsgenerator - Zahlen auslassen ?
 
Alle, auf 0, weil bei dir 0 nie vorkommt, und du wolltest doch astronomische Zahlen wie 2362734 vermeiden... Bei dir sähe der Showmessage-Code dann so aus:
Delphi-Quellcode:
var Used: array[1..10] of Integer; i, x, t: Integer;
begin
  Randomize;
  i := 1;
  FillChar(Used[1], 10*sizeof(Uses[1]), 0);
  while i <> 11 do
  begin
    t := Random(10)+1;
    for x := 1 to i do
      if Used[x] = t then Break;
    if x = i+1 then
    begin
      ShowMessage(IntToSTr(t));
      Used[i] := t;
      Inc(i);
    end;
  end;
end;

Cyberbob_at_tot 20. Okt 2004 11:20

Re: Zufalsgenerator - Zahlen auslassen ?
 
OK Super es läuft schonmal.
Beim Durchgehen lässt er den letzten aber immer aus! im Array bleibt 0 stehen. es kommen nur 9 von 10 Messages mit den Zahlen!

Dax 20. Okt 2004 11:24

Re: Zufalsgenerator - Zahlen auslassen ?
 
Dann liegt es an dir, der Code funktioniert bei mir perfekt, nirgends steht mehr 0 drin.

Cyberbob_at_tot 20. Okt 2004 11:27

Re: Zufalsgenerator - Zahlen auslassen ?
 
Jo war auch mein Fehler,
musste ID.length noch +1 nehmen damit der letzte durchgang mitkommt!


BESTEN DANK ERSTMAL FÜR DIE HILFE

negaH 20. Okt 2004 11:29

Re: Zufalsgenerator - Zahlen auslassen ?
 
Jaja, ziehe zufällig Zahlen aus 1 bis 10 ohne zurücklegen, das Thema hatten wir schon merhmals, es nennt sich Lotto-Ziehungen.

http://www.delphipraxis.net/internal...ct.php?t=10946

Delphi-Quellcode:
type
  TZahlen = array of Integer;

procedure Lotto(var Sortiert,Gezogene: TZahlen; Ziehungen: Integer = 6; Elemente: Integer = 49);
var
  I,J,K,N: Integer;
begin
  Sortiert := nil; // stellt sicher das Sortiert <> Gezogene ist
  Gezogene := nil;

  if Ziehungen > Elemente then
    raise Exception.Create('Man kann nicht mehr Kugeln ziehen als in der Urne sind');

  SetLength(Sortiert, Ziehungen);
  SetLength(Gezogene, Ziehungen);

  for I := 0 to Ziehungen -1 do
  begin
    K := 0;
    N := Random(Elemente - I) + 1;
    for J := 0 to I -1 do
      if N >= Sortiert[J] then
      begin
        Inc(N);
        Inc(K);
      end else Break;
    for J := I downto K +1 do
      Sortiert[J] := Sortiert[J -1];
    Sortiert[K] := N;
    Gezogene[I] := N;
  end;
end;

procedure Test;

  procedure Print(const Title: String; const Zahlen: TZahlen);
  var
    I: Integer;
  begin
    Write(Title);
    for I := 0 to High(Zahlen) do Write(Zahlen[I]:4);
    WriteLn;
  end;

var
  Sortiert,Gezogene: TZahlen;
begin
  Lotto(Sortiert, Gezogene, 10, 10);

  Print('gezogene : ', Gezogene);
  Print('sortiert : ', Sortiert);
  WriteLn;
end;
Gruß hagen

mung 25. Okt 2004 13:10

Re: Zufalsgenerator - Zahlen auslassen ?
 
Delphi-Quellcode:
function ZufallIA(loinp,hiinp,laenge:integer):AoInt;

{type AoInt=array of integer;}//Wenn nötig deklarieren!

var pos,laenge,i:integer;
    puffer:AoInt;

 procedure ZufalloD(var a:AoInt;lo,hi:integer);
  var z,b:integer;
  begin
   b := hi-lo;
   z:=Random(b)+lo;
   a[pos] :=z;
   inc(pos);

   if(lo<z)and(pos<=laenge) then
     ZufalloD(a,lo,z-1);

   if(hi>z)and(pos<=laenge) then
     ZufalloD(a,z+1,hi);

  end;

begin
 randomize;
 setlength(puffer,laenge);
 pos:=low(puffer);
 ZufalloD(puffer,loinp,hiinp);
end;
Müsstest du so aufrufen: zielarray:= ZufallIA(1,10,10);


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:37 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