Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Random (https://www.delphipraxis.net/2361-random.html)

Lammbock0 19. Jan 2003 18:19


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?

CalganX 19. Jan 2003 18:23

Hi,
Wie der Titel schon lautet: random(range: integer); Wenn du also eine Zufallszahl zwischen 0 und 100 haben willst schreibst du:
Delphi-Quellcode:
i := random(100);
Wobei i eine Zahl vom Typ integer ist. Für weiteres schaust du am besten in die Hilfe!

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

sakura 19. Jan 2003 18:23

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.

sakura 19. Jan 2003 18:25

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:...

Lammbock0 19. Jan 2003 18:33

wenn ich Random * 100 schreibe kommt aber die Fehlermeldung "incompatible Types" . Und jetzt?
Oder habe ich das falsch verstanden?

sakura 19. Jan 2003 18:35

Erstell mal schnell ein neues Projekt, packe einen Button auf das Formular und schreibe folgenden Code in das OnClick Ereignis des Buttons
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  dblZufallszahl: Double;
begin
  dblZufallszahl := Random * 100;
  ShowMessage(FloatToStr(dblZufallszahl));
end;
...:cat:...

Luckie 19. Jan 2003 19:05

Und wo bleibt: Randomize?

phlux 19. Jan 2003 21:04

Randomize hat Sakura natürlich ins OnCreate Event der Form geschriebn ;)

sakura 19. Jan 2003 21:05

Zitat:

Zitat von phlux
Randomize hat Sakura natürlich ins OnCreate Event der Form geschriebn ;)

Und zwar genau ein Mal.

Privateer3000 20. Jan 2003 01:56

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.

Luckie 20. Jan 2003 01:59

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.

MrSpock 20. Jan 2003 06:32

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.

Sharky 20. Jan 2003 09:03

Zitat:

Zitat von Privateer3000
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.

Ähm...

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?

Privateer3000 20. Jan 2003 11:17

[quote="Sharky"]
Zitat:

Zitat von Privateer3000
da möchte ich doch gleich mal

wenn Du das so machst hast Du keine Zufahlszahlen

stimmt...ich kam halt nur beim lesen auf die Idee
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?

nailor 20. Jan 2003 13:00

Zufallszahl zwischen 0 und 100 ist aber Random(101) :!:

Sebastian Nintemann 20. Jan 2003 15:26

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

Privateer3000 20. Jan 2003 15:48

hhmmm
wie meinst du das mit dem "vermischen"?
Das verstehe ich nicht ganz.
Aber das andere leuchtet schon ein :wink:

nailor 20. Jan 2003 16:06

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.

BrunoT 23. Jan 2003 23:05

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 13:09 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