![]() |
Zahlen nur einmal vorkommen lassen
Hi Leute!
Ganz simple Situation: Ich würfel 13 mal mit einem Spielraum von 1 - 13:
Delphi-Quellcode:
Jetzt soll aber verhindert werden, dass eine der Zahlen mehrmals vorkommt.
x= random(13) + 1
es sollen beim würfeln also alle Zahlen, jeweils 1 mal, vorkommen. Wie mache ich das? Danke für alle Antworten |
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
|
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: |
Re: Zahlen nur einmal vorkommen lassen
hmm das mit dem merken hab ich mir schon gedacht, aber wie sieht das im Code aus?
|
Re: Zahlen nur einmal vorkommen lassen
Z.B. in einem dyn. Array oder einer Liste.
|
Re: Zahlen nur einmal vorkommen lassen
Zitat:
![]() Zitat:
|
Re: Zahlen nur einmal vorkommen lassen
Ich würde aber eher die andere Lösung priorisieren
|
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; |
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?
|
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:
Das solltest Du umsetzen können.
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; 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 10:24 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