| Autor |
Beitrag |
HastaLa
Hält's aus hier
Beiträge: 3
|
Verfasst: So 23.11.08 13:19
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
|
|
Robert.Wachtel
      
Beiträge: 895
Erhaltene Danke: 7
Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
|
Verfasst: So 23.11.08 13:41
Das Zahlensystem spielt ja gar keine Rolle - du willst ganze Zahlen im Bereich von 0 bis einschließlich 27 erzeugen:
Quelltext 1:
| iZufaelligeZahl := Random(28); |
That's it.
Bitte aber vorher einmal (und wirklich exakt genau nur einmal) Randomize aufrufen.
www.delphibasics.co.uk/RTL.asp?Name=Random
www.delphibasics.co....L.asp?Name=Randomize
www.delphibasics.co....asp?Name=RandomRange
|
|
platzwart
      
Beiträge: 1054
Erhaltene Danke: 78
Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
|
Verfasst: So 23.11.08 13:51
|
|
HastaLa 
Hält's aus hier
Beiträge: 3
|
Verfasst: So 23.11.08 14:25
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
      
Beiträge: 895
Erhaltene Danke: 7
Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
|
Verfasst: So 23.11.08 14:29
|
|
Robert.Wachtel
      
Beiträge: 895
Erhaltene Danke: 7
Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
|
Verfasst: So 23.11.08 14:35
|
|
ub60
      
Beiträge: 765
Erhaltene Danke: 130
|
Verfasst: So 23.11.08 14:40
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 
Hält's aus hier
Beiträge: 3
|
Verfasst: 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
      
Beiträge: 895
Erhaltene Danke: 7
Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
|
Verfasst: So 23.11.08 14:56
|
|
Robert.Wachtel
      
Beiträge: 895
Erhaltene Danke: 7
Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
|
Verfasst: 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...! [...] |
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
      
Beiträge: 1314
Debian Squeeze, Win 7 Prof.
D7 Pers
|
Verfasst: 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?
_________________ If liberty means anything at all, it means the right to tell people what they do not want to hear. - George Orwell
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: So 23.11.08 16:22
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?
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.
_________________ Na denn, dann. Bis dann, denn.
|
|
Robert.Wachtel
      
Beiträge: 895
Erhaltene Danke: 7
Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
|
Verfasst: So 23.11.08 16:23
alzaimar hat folgendes geschrieben : | | Weisst Du auch, warum? [...] |
Ja, steht ja schliesslich tausendfach schon im Internet...
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: So 23.11.08 16:37
_________________ Na denn, dann. Bis dann, denn.
|
|
Robert.Wachtel
      
Beiträge: 895
Erhaltene Danke: 7
Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
|
Verfasst: So 23.11.08 16:40
|
|
ub60
      
Beiträge: 765
Erhaltene Danke: 130
|
Verfasst: 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
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: So 23.11.08 19:05
_________________ Na denn, dann. Bis dann, denn.
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: So 23.11.08 19:20
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  .
_________________ >λ=
|
|
Tilman
      
Beiträge: 1405
Erhaltene Danke: 51
Win 7, Android
Turbo Delphi, Eclipse
|
Verfasst: 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.
_________________ Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: 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?
_________________ Na denn, dann. Bis dann, denn.
|
|
|