Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Zahlen nur einmal vorkommen lassen (https://www.delphipraxis.net/150841-zahlen-nur-einmal-vorkommen-lassen.html)

Reap3r 28. Apr 2010 20:49


Zahlen nur einmal vorkommen lassen
 
Hi Leute!

Ganz simple Situation:

Ich würfel 13 mal mit einem Spielraum von 1 - 13:
Delphi-Quellcode:
x= random(13) + 1
Jetzt soll aber verhindert werden, dass eine der Zahlen mehrmals vorkommt.
es sollen beim würfeln also alle Zahlen, jeweils 1 mal, vorkommen.

Wie mache ich das?

Danke für alle Antworten

mkinzler 28. Apr 2010 20:53

Re: Zahlen nur einmal vorkommen lassen
 
Schreibe die Zahlen in einen dynamischen Array oder einer Liste. Dann wähle durch Zufall eine aus. Entferne diese aus dem Array/der Liste

himitsu 28. Apr 2010 20:53

Re: Zahlen nur einmal vorkommen lassen
 
a) entweder alle schon gewürfelten Nummer merken
und wenn die gerade gewürfelte Nummer schonmal vorkam, dann solange weiterwürfeln, bis eine andere Nummer auftaucht.

b) eine liste aller nummern erstellen und via Zufall eine Nummer aus der Liste ziehen
nach der Ziehung die Nummer da rauslöschen.

Vorteil von letzerem ist, daß man keine Ziehung wiederholen muß.


[add]
schonwieder keine RedBox :evil:

Reap3r 28. Apr 2010 21:06

Re: Zahlen nur einmal vorkommen lassen
 
hmm das mit dem merken hab ich mir schon gedacht, aber wie sieht das im Code aus?

mkinzler 28. Apr 2010 21:09

Re: Zahlen nur einmal vorkommen lassen
 
Z.B. in einem dyn. Array oder einer Liste.

himitsu 28. Apr 2010 21:09

Re: Zahlen nur einmal vorkommen lassen
 
Zitat:

Zitat von Reap3r
aber wie sieht das im Code aus?

Da würde ich einfach mal auf die Forensuche verweisen ... vorallem auf die paar Hier im Forum suchenLotto-Threads.

Zitat:

Zitat von mkinzler
Z.B. in einem dyn. Array oder einer Liste.

oder ein SET of (1..13)

mkinzler 28. Apr 2010 21:36

Re: Zahlen nur einmal vorkommen lassen
 
Ich würde aber eher die andere Lösung priorisieren

Reap3r 28. Apr 2010 21:47

Re: Zahlen nur einmal vorkommen lassen
 
Ich hab mir überlegt das ganze so zu gestalten, aber irgendwas stimmt nicht.

Delphi-Quellcode:
 var a: array [1..13] of integer;
 var i, x, j : integer; ok: boolean;
begin
 fori:=1 to 13 do
  begin
   x:= random(13)+1;
   ok:= true;
   for j:=1 to 13 do
    if x = a[j]
     then ok:= false;
   if ok then a[i] := x;
end;
end;

mkinzler 28. Apr 2010 22:01

Re: Zahlen nur einmal vorkommen lassen
 
Du solltest unsere Tipps annhemen. Überlege mal wie du es unabhängig vom Rechner machen würdest, wenn du 13 Karten hättest. Würdest du nach dem du eine gezogen hast den wert aufschreiben und die Karte zurücköegen und nach jedem Zug schauen, ob der Wert auf der Liste steht oder auf ein Rücklegen verzichten?

alzaimar 29. Apr 2010 06:52

Re: Zahlen nur einmal vorkommen lassen
 
Ich weiss ja, wie man es richtig macht (Fisher-Yates), aber beim Ziehen von Karten ist mir das in den Sinn gekommen (Ich denke, das geht noch als Hilfe, ohne einem die Arbeit abzunehmen):
Delphi-Quellcode:
Procedure ZufaeligeReihenfolgeVonDreizehnZahlen;
Var
  i : Integer;
  Liste : TListeVonZahlen; // Geeigneten Datentyp ausdenken

Begin
  SchreibeDreizehnZahlenInDie(Liste); // Das ist einfach zu programmieren
  For i := 1 to 13 do begin
    Zahl := ZieheEineZufaelligeZahlAusDer(Liste); // Das auch
    Writeln('Gezogene Zahl ',Zahl);
    Entferne(Zahl, {aus der} Liste); // Und das auch, hinterher hat die Liste ein Element weniger
  End;
End;
Das solltest Du umsetzen können.

Optimierungsvorschlag:
Man könnte das Ziehen und Entfernen auch in eine Routine packen. Das wäre natürlich viel schneller, weil ich ja die Position der Zahl kenne, die ich zufällig ausgewählt habe.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:24 Uhr.
Seite 1 von 2  1 2      

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