Delphi-PRAXiS

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.

hoika 29. Apr 2010 06:56

Re: Zahlen nur einmal vorkommen lassen
 
Hallo,

geeeigneter Datentyp TStringList

Da alle 13 Zahlen rein
per
Delphi-Quellcode:
Random(StrList.Count-1) // (oder Count, habs gerade nicht im Kopf)
eine Zahl rausziehen und per Delete löschen.


Heiko

p80286 29. Apr 2010 09:48

Re: Zahlen nur einmal vorkommen lassen
 
Zitat:

Zitat von Reap3r
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

Bei 13 Würfen, bei denen keine Zahl "doppelt" vorkommen darf, wird das Ergebnis zwangsläufig 1..13 lauten.

Gruß
K-H

Mithrandir 29. Apr 2010 09:51

Re: Zahlen nur einmal vorkommen lassen
 
Zitat:

Zitat von p80286
Bei 13 Würfen, bei denen keine Zahl "doppelt" vorkommen darf, wird das Ergebnis zwangsläufig 1..13 lauten.

1..13 <> 1,5,4,6,8,10,13,12 ;)

himitsu 29. Apr 2010 10:05

Re: Zahlen nur einmal vorkommen lassen
 
Willst du eigentlich 13 Zahlen von 1 bis 13 in unterschiedlicher Reihenfolge

oder einige Zahlen (weniger als 13), welche im Bereich von 1 bis 13 liegen, aber sich nicht wiederholen dürfen?


Für Ersteres wurden ja schon Lösungen genannt.

Und für letzeres gibt es noch eine weitere und "einfache" Lösung.
> alle 13 Zahlen in eine Liste
> diese Liste mischen
> und dann nur noch die gemischte Liste auslesen

p80286 29. Apr 2010 11:06

Re: Zahlen nur einmal vorkommen lassen
 
Zitat:

Zitat von Mithrandir
Zitat:

Zitat von p80286
Bei 13 Würfen, bei denen keine Zahl "doppelt" vorkommen darf, wird das Ergebnis zwangsläufig 1..13 lauten.

1..13 <> 1,5,4,6,8,10,13,12 ;)

Reihenfolge? welche Reihenfolge?
und die Idee von Himitsu ist ja auch mal nicht so schlecht, fehlt jetzt vielleicht noch die GeWichtung ?

Gruß
K-H

Mithrandir 29. Apr 2010 11:20

Re: Zahlen nur einmal vorkommen lassen
 
Zitat:

Zitat von p80286
Reihenfolge? welche Reihenfolge?

Es geht nicht um die Reihenfolge. Würfelt man 13 mal und will keine Zahlen doppelt, dann ist auch eine Reihe a la 1,5,6,9,10,13 möglich, wenn man bei einer Dopplung nicht erneut würfelt. Und da die 13 feststehen, gehe ich davon aus, dass hier nicht 13 Zahlen von 1..13 gefordert sind, sondern 13 Züge mit einer resultierenden Zahlenmenge <= 13 ;)

Reap3r 29. Apr 2010 15:47

Re: Zahlen nur einmal vorkommen lassen
 
Sry wenn ich mich zu undeutlcih ausgedrückt habe, doch ich will dass 13 zahlen von 1..13 gewürfelt werden, alle vorkommen, jedoch jeweils nur einmal.

DeddyH 29. Apr 2010 16:31

Re: Zahlen nur einmal vorkommen lassen
 
Dann erstellt Dir eine Liste (z.B. TList oder meinetwegen auch TStringlist), pack da die Zahlen rein und zieh sie zufällig wieder raus.
Delphi-Quellcode:
while Liste.Count > 0 do
  begin
    Index := Random(List.Count);
    Zahl := Liste[Index];
    Liste.Delete(Index);
  end;

hoika 29. Apr 2010 21:09

Re: Zahlen nur einmal vorkommen lassen
 
Hallo,

was ist an #11 so schwer zu verstehen.
Fang doch mal im Kopf mit 3 Zahlen an.


Heiko


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