![]() |
Random
wie funktionert eine Generierung von Zufallszahlen in Delphi/Pascal?
Und wie schreibe ich diese in eine datei und wie öffne ich diese datei wieder? |
Hi,
Wie der Titel schon lautet: random(range: integer); Wenn du also eine Zufallszahl zwischen 0 und 100 haben willst schreibst du:
Delphi-Quellcode:
Wobei i eine Zahl vom Typ integer ist. Für weiteres schaust du am besten in die Hilfe!
i := random(100);
Schau dir mal in der Hilfe die Themen "TextFile", "AssignFile" an. Folge auch den "Siehe auch"-Links! Und sieh dir die Beispiel an! Wenn du nicht weiterkommst, dann kannst du ja nochmal posten! Chris |
Schon viel besser ;)
Zufallszahlen erhälst Du ganz einfach mit Random (Siehe auch Randomize) Speichern und Laden könntest Du diese zum Beispiel mit Hilfe eine TStringList. Ist wohl die einfachste Methode. Die Delphi Hilfe ist da sehr aussagekräftig. |
Mir fällt da noch ein, Du wolltest ja Fließkomme-Zahlen im Bereich von 0 bis 100.
Random(100) gibt Integer zurück Random * 100 ergibt eine Fließkommazahl im gewünschten Bereich. ...:cat:... |
wenn ich Random * 100 schreibe kommt aber die Fehlermeldung "incompatible Types" . Und jetzt?
Oder habe ich das falsch verstanden? |
Erstell mal schnell ein neues Projekt, packe einen Button auf das Formular und schreibe folgenden Code in das OnClick Ereignis des Buttons
Delphi-Quellcode:
...:cat:...
procedure TForm1.Button1Click(Sender: TObject);
var dblZufallszahl: Double; begin dblZufallszahl := Random * 100; ShowMessage(FloatToStr(dblZufallszahl)); end; |
Und wo bleibt: Randomize?
|
Randomize hat Sakura natürlich ins OnCreate Event der Form geschriebn ;)
|
Zitat:
|
da möchte ich doch gleich mal einhaken...
und zwar wie kann man verhindern das (legen wir eine Range bis 100 fest) jede Zahl nur 1mal gezeigt wird?!Und zwar so lange bis alle aufgebraucht sind.Wäre interessant für eine Auslosungsgeschichte. |
In einem Array die schon gezogenen speichern und bei jeder neuen Ziehung vergleichen. Wurde die zahl schon mal gezogen, noch mal ziehen. So lange bis man eine zieht, die es noch nicht gab.
|
Hallo Privateer3000,
Luckies Vorschlag funktioniert zwar, ist aber nicht so ganz effektiv :mrgreen: . Bei der letzten Zahl musst du solange neue Zufallszahlen generieren bis genau die Zahl rauskommt, die noch fehlt. Etwas besser ist es da (insbesondere bei noch größeren Bereichen) die gezogene Zufallszahl als Zähler in der Menge der noch nicht gefundenen Zahlen zu benutzen. |
Zitat:
wenn Du das so machst hast Du keine Zufahlszahlen (Du hast ja einfach alle Zahlen aus einer Gegebenen Menge "erzeugt"). Was Du hast ist eine zufällige Reihenfolge der Zahlen. Aber das kann man sicher auch anders lösen? |
[quote="Sharky"]
Zitat:
da ich dies mal in kürze benötige. Aber im gewissen Sinne ist es schon eine Zufallszahl. Denn aus der gegebenen Menge will ich ja keine bestimmte,sondern eben eine zufällige. Kann man eine aus dem array erzeugte Zahl löschen(oder markieren) das sie beim nächsten Zugriff "nicht beachtet" wird? |
Zufallszahl zwischen 0 und 100 ist aber Random(101) :!:
|
Hi, ich hab das mal so gemacht (alle dürfen nur einmal vorkommen):
1. Array von 1 bis 100 mit den Zahlen 1 bis 100 belegen 2. Die Zahlen mit random vertauschen, mindestens jede Zahl einmal mit einer anderen tauschen, je öfter desto "durchgemischter". Durch das tauschen verhinderst du, dass Zahlen doppelt vorkommen, da keine neuen Zahlen erzeugt werden, sondern nur die von 1 bis 100 ihre Position wechseln, es muss nicht mehr geprüft werden ob eine grad erzeugte Zahl eventuell schonmal da war. 3. Jetzt kannst du mit Array[1] bis Array[100] die zufällige Zahlenfolge abfragen. Gruß, Sebastian |
hhmmm
wie meinst du das mit dem "vermischen"? Das verstehe ich nicht ganz. Aber das andere leuchtet schon ein :wink: |
Du erzeugst dein Array erst mal mit den Zahlen 1-100 der Reihe nach.
Du erzeugst zwei zufällige Indices I1 und I2. Die Zahl in dem Array mit dem Index kopierst du in eine temporäre Variable, die Zahl in dem Array mit dem Index I2 kopierst du in den Array auf den Index I1 und dann die temporäre Variable in den Array kopieren an Stelle I2. Das ganze solange du Lust hast wiederholen. Ist zwar nicht ganz so schön, aber leicht umzusetzen und funzt. |
Array
Kann man eine aus dem array erzeugte Zahl löschen(oder markieren)
das sie beim nächsten Zugriff "nicht beachtet" wird? Na klar Type z=record Zahl:integer; Flag:boolean; end; Var a:Array[1.100] of z; For i:=1 to 100 do Begin a[i].Zahl:=random(100)+1; { Berücksichtigt nur Zahlen von 1-100} a[i].Flag:=False; end; Nun lässt sich jede Zahl als berücksichtigt markieren. mfg |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:03 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