Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Zufällige Zahlen des Dualsystems erzeugen
HastaLa - So 23.11.08 13:19
Titel: Zufällige Zahlen des Dualsystems erzeugen
Hey!
Wie kann ich zufällige Zahlen des Dualsystems erzeugen, die sich in einem bestimmten Rahmen bewegen? Zum Beispiel soll die kleinste Zahl 0, die größte 11011 ( = 27) sein usw.
Also möchte ich die erzeugten Zahlen in einem bestimmten Rahmen bewegen lassen.
Habe noch nicht mit der random-Funktion gearbeitet und bin ein ziemlicher Anfänger.
Anregungen, Tipps wären mir sehr hilfreich!
Gruß, HastaLa
platzwart - So 23.11.08 13:51
Titel: Re: Zufällige Zahlen des Dualsystems erzeugen
Robert.Wachtel hat folgendes geschrieben : |
Bitte aber vorher einmal (und wirklich exakt genau nur einmal) Randomize aufrufen.
|
am besten in OnCreate der Form ;)
HastaLa - So 23.11.08 14:25
Titel: Re: Zufällige Zahlen des Dualsystems erzeugen
Robert.Wachtel hat folgendes geschrieben : |
| Das Zahlensystem spielt ja gar keine Rolle - du willst ganze Zahlen im Bereich von 0 bis einschließlich 27 erzeugen |
Danke erstmal!
Doch sorry, es müssen Dualzahlen erzeugt werden...;-)
Gruß, HastaLa
Robert.Wachtel - So 23.11.08 14:29
Titel: Re: Zufällige Zahlen des Dualsystems erzeugen
platzwart hat folgendes geschrieben : |
Robert.Wachtel hat folgendes geschrieben : |
Bitte aber vorher einmal (und wirklich exakt genau nur einmal) Randomize aufrufen.
|
am besten in OnCreate der Form ;) |
Ganz schlechter Tipp - es soll gerüchteweise sogar Forms geben, die mehrmals erzeugt werden. Und dann waren da noch die Programme, die Zufallszahlen brauchen, bevor überhaupt eine Form erzeugt wurde.
Besser wäre der initialization-Part des Hauptprogramms.
Robert.Wachtel - So 23.11.08 14:35
Titel: Re: Zufällige Zahlen des Dualsystems erzeugen
HastaLa hat folgendes geschrieben : |
Robert.Wachtel hat folgendes geschrieben : | | Das Zahlensystem spielt ja gar keine Rolle - du willst ganze Zahlen im Bereich von 0 bis einschließlich 27 erzeugen |
[...] Doch sorry, es müssen Dualzahlen erzeugt werden...;-) [...] |
:autsch: :autsch: :autsch:
Und jetzt verrate uns mal, was eine Dualzahl von einer Ganzzahl unterscheidet? Sollte eine Dualzahl etwa tatsächlich eine Ganzzahl sein?
Wahrscheinlich willst Du nur eine Ganzzahl in Dualzahl-
Schreibweise ausgeben, oder?
ub60 - So 23.11.08 14:40
Titel: Re: Zufällige Zahlen des Dualsystems erzeugen
Robert.Wachtel hat folgendes geschrieben : |
| Bitte aber vorher einmal (und wirklich exakt genau nur einmal) Randomize aufrufen. |
Was spricht gegen einen mehrfachen Aufruf von Randomize?
Da hier nur ein aus der Uhrzeit generierter Randseed-Wert erzeugt wird, sehe ich darin keine sooooo kritische Handlung.
ub60
HastaLa - So 23.11.08 14:52
Ich brauche die Dualzahl, da sie Bestandteil einer Sprache sein soll.
Die zufällige Zahl überprüfe ich dann noch darauf, ob sie wirklich ein Wort der Sprache ist, oder ob es sich dabei um ein FehlerWort handelt.
Die Sprache wird aus bestimmten Dualzahlen gebildet.
Würde ich nun zu Beginn eine zufällige Ganzzahl erzeugen, müsste ich diese erst wieder in Dualschreibweise umwandeln, damit ich überhaupt überprüfen kann, ob diese zur Sprache gehört oder eben nicht...!
Gruß, HastaLa
Robert.Wachtel - So 23.11.08 14:56
Titel: Re: Zufällige Zahlen des Dualsystems erzeugen
ub60 hat folgendes geschrieben : |
Robert.Wachtel hat folgendes geschrieben : | | Bitte aber vorher einmal (und wirklich exakt genau nur einmal) Randomize aufrufen. |
Was spricht gegen einen mehrfachen Aufruf von Randomize?
Da hier nur ein aus der Uhrzeit generierter Randseed-Wert erzeugt wird, sehe ich darin keine sooooo kritische Handlung.
ub60 |
Sorry, das war falsch von mir: ich meinte eigentlich, dass Randomize nach dem Aufruf von Random nicht mehr aufgerufen werden sollte. Siehe auch die Hilfe.
Robert.Wachtel - So 23.11.08 14:59
HastaLa hat folgendes geschrieben : |
Ich brauche die Dualzahl, da sie Bestandteil einer Sprache sein soll.
Die zufällige Zahl überprüfe ich dann noch darauf, ob sie wirklich ein Wort der Sprache ist, oder ob es sich dabei um ein FehlerWort handelt.
Die Sprache wird aus bestimmten Dualzahlen gebildet.
Würde ich nun zu Beginn eine zufällige Ganzzahl erzeugen, müsste ich diese erst wieder in Dualschreibweise umwandeln, damit ich überhaupt überprüfen kann, ob diese zur Sprache gehört oder eben nicht...! [...] |
:autsch:
Ich wiederhole mich: Dualzahl = Ganzzahl.
Und was meinst Du: wie wird eine Ganzzahl im Rechner gespeichert?
Und wie eine zufällig erzeugte Ganzzahl in binärer Schreibweise ausgegeben wird, findest Du sicherlich über die Suchfunktion hier im Forum...
Timosch - So 23.11.08 15:47
HastaLa hat folgendes geschrieben : |
Ich brauche die Dualzahl, da sie Bestandteil einer Sprache sein soll.
Die zufällige Zahl überprüfe ich dann noch darauf, ob sie wirklich ein Wort der Sprache ist, oder ob es sich dabei um ein FehlerWort handelt.
Die Sprache wird aus bestimmten Dualzahlen gebildet.
Würde ich nun zu Beginn eine zufällige Ganzzahl erzeugen, müsste ich diese erst wieder in Dualschreibweise umwandeln, damit ich überhaupt überprüfen kann, ob diese zur Sprache gehört oder eben nicht...!
Gruß, HastaLa |
Im Computer sind alle Ganzzahlen Binärzahlen. Die Frage ist bloß, wie sie ausgegeben werden. Wenn du zufäiige Binärzahlen willst, erzeuge ganz normale Zahlen und wandle sie halt nicht mit IntToStr um, sondern mit einer Methode fürs Binärsystem (dazu findeste was in der Forensuche oder alternativ auf delphi-treff.de). Das versucht Wachtel dir auch schon die ganze Zeit zu erklären. Ist das so schwer zu verstehen?
alzaimar - So 23.11.08 16:22
Titel: Re: Zufällige Zahlen des Dualsystems erzeugen
Robert.Wachtel hat folgendes geschrieben : |
| Sorry, das war falsch von mir: ich meinte eigentlich, dass Randomize nach dem Aufruf von Random nicht mehr aufgerufen werden sollte. Siehe auch die Hilfe. |
Weisst Du auch, warum?
Du kannst Randomize 1.000.000 mal aufrufen, dein Programm wird weder abstürzen, noch wird der PC Schaden nehmen. Wieso sollte man Randomize also nur einmal aufrufen? :gruebel:
Also, um es kurz zu machen: Randomize setzt einen neuen Startwert (Seed) für den Pseudorandomnumbergenerator. Die Funktion berechnet eigentlich anhand des Seed-Wertes einen neuen 'Seed' und liefert diese Zahl als Zufallszahl. Diese Zahlen haben die Eigenschaft, gleichverteilt über den Zahlenraum zu sein, die Gleichverteilung ist also ein Charakteristikum der Randomfunktion! Wenn wir zwischendurch 'Randomize' aufrufen, wird ein neuer Seed ermittelt. Damit wäre aber die Gleichverteilung der Randomfunktion nicht mehr gewährleistet. Und *das* ist der einzige Grund, 'Randomize' nicht ständig aufzurufen.
Ihr seht, es ist vollkommen harmlos, Randomize öfters aufzurufen, solange man keine statistisch gleichverteilten Zufallszahlen benötigt. Wenn man z.B. ein Spiel mit Zufall (Würfelspiel) programmiert, kann man 'Randomize' z.B. VOR jedem Spielstart oder auch nach Wunsch mittendrin aufrufen. Das ist so, als ob man die Würfel austauscht...
Wenn man, z.B. für Monte-Carlo-Analysen, eine Folge von gleichverteilten Zufallszahlen benötigt, dann -und nur dann- darf man Randomize nicht während der Erstellung aufrufen, weil dadurch die Gleichverteilung nicht mehr gewährleistet ist. Das heißt natürlich nicht, das sie nicht mehr vorhanden ist, man kann sich nur nicht darauf verlassen.
Robert.Wachtel - So 23.11.08 16:23
Titel: Re: Zufällige Zahlen des Dualsystems erzeugen
alzaimar hat folgendes geschrieben : |
| Weisst Du auch, warum? [...] |
Ja, steht ja schliesslich tausendfach schon im Internet...
alzaimar - So 23.11.08 16:37
Titel: Re: Zufällige Zahlen des Dualsystems erzeugen
Robert.Wachtel hat folgendes geschrieben : |
alzaimar hat folgendes geschrieben : | | Weisst Du auch, warum? [...] |
Ja, steht ja schliesslich tausendfach schon im Internet... |
Aber wieso schreibst Du dann
Robert.Wachtel hat folgendes geschrieben : |
| Bitte aber vorher einmal (und wirklich exakt genau nur einmal) Randomize aufrufen. |
als ob es Blasphemie wäre, es 2x aufzurufen. :lol: Egal. Die Erklärung ist ja auch für andere.
ub60 - So 23.11.08 17:13
alzaimar hat folgendes geschrieben : |
Also, um es kurz zu machen: Randomize setzt einen neuen Startwert (Seed) für den Pseudorandomnumbergenerator. Die Funktion berechnet eigentlich anhand des Seed-Wertes einen neuen 'Seed' und liefert diese Zahl als Zufallszahl. |
Das stimmt so auch nicht. Ich habe mir mal die Sourcen angesehen, und da steht (den Linuxteil hab ich mal weggelassen):
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| procedure Randomize; var Counter: Int64; begin if QueryPerformanceCounter(Counter) then RandSeed := Counter else RandSeed := GetTickCount; end; |
Das heißt, dass man auf die ein oder andere Variante nachschaut, wie lange der Computer schon "in Betrieb" ist. Dieser Wert wird dann als Startwert für den Zufallszahlengenerator (eine Formel) genommen. Dabei sehe ich zwei Anwendungsfälle:
- Ich möchte eine gute Gleichverteilung, dann ist der mehrfache Aufruf nicht sinnvoll (s.o.).
- Ich möchte "wirklich" zufällige Zahlen, dann sollte der mehrfache Aufruf (allerdings nicht in gleichen Intervallen) "bessere" Zufallszahlen bringen, als der einfache Aufruf. Wer das nicht glaubt, sollte mal nach dem Thema "Knacken eines Zufallszahlengenerators" googeln, da gibt es sehr interessante Artikel (ev. auf englisch, hab den Link im Moment nicht parat). Kryptografisch sicher ist das Ganze immer noch nicht, aber ich _vermute_, es ist besser als die Variante mit nur einem Randomize
Doch zurück zum Topic:
Wenn Du im Forum nach "IntToBin" suchst, findest Du verschiedene Varianten.
Ich hab hier mal schnell eine ganz kurze zusammengeschrieben:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| function IntToBin(Zahl:Integer):String; begin if Zahl<2 then Result:=IntToStr(Zahl) else Result:=IntToBin(Zahl shr 1)+IntToStr(Zahl mod 2) end; |
ub60
alzaimar - So 23.11.08 19:05
ub60 hat folgendes geschrieben : |
| Das stimmt so auch nicht. Ich habe mir mal die Sourcen angesehen... |
Doch, es stimmt haargenau. Kannst Du nicht lesen? :lol:
ub60 hat folgendes geschrieben : |
| ...Ich möchte "wirklich" zufällige Zahlen, dann sollte der mehrfache Aufruf (allerdings nicht in gleichen Intervallen) "bessere" Zufallszahlen bringen, als der einfache Aufruf. |
Aua. Was heißt "besser"? Wenn überhaupt, dann "undeterministischer", dann brauche ich den PRNG aber nicht. Wenn man höhere Ansprüche an den Generator stellen muss, sollte man auch einen besseren PRNG nehmen, z.B. den Mersenne-Twister.
Kha - So 23.11.08 19:20
Titel: Re: Zufällige Zahlen des Dualsystems erzeugen
alzaimar hat folgendes geschrieben : |
| Ihr seht, es ist vollkommen harmlos, Randomize öfters aufzurufen, solange man keine statistisch gleichverteilten Zufallszahlen benötigt. |
Nur nicht den Fehler machen, es so schnell hintereinander aufzurufen, dass sich der Seed gar nicht ändert ;) . Gerade bei Sprachen ohne globalen Zufallsgenerator kann einem das schonmal passieren, ich spreche aus Erfahrung :D .
Tilman - Mo 24.11.08 03:25
Ja, ein typischer Anfängerfehler. Besonders wenn man Randomize in einer Schleife aufruft bekommt man schlechtere Zufallszahlen. Und besser werden sie sowieso nicht, daher ist es schon ne gute Richtschnur randomize nur einmal aufzurufen. Gegen ein aufrufen in OnCreate spricht aber trotzdem nichts, denn wenn man randomize dann doch ein paar mal öfter aufruft ist das auch kein Beinbruch.
alzaimar - Mo 24.11.08 07:59
Tilman hat folgendes geschrieben : |
| ... Gegen ein aufrufen in OnCreate spricht aber trotzdem nichts, ... |
Außer, wenn schon *vorher* Zufallszahlen benötigt werden. Warum nicht im Projekt-Quelltext direkt VOR dem 'Application.Initialize'? Oder zumindest im 'Initialization'-abschnitt einer Unit, die oben in der Uses-Liste des Projektes steht?
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!