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


Robert.Wachtel - So 23.11.08 13:41
Titel: Re: Zufällige Zahlen des Dualsystems erzeugen
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.

http://www.delphibasics.co.uk/RTL.asp?Name=Random
http://www.delphibasics.co.uk/RTL.asp?Name=Randomize
http://www.delphibasics.co.uk/RTL.asp?Name=RandomRange


platzwart - So 23.11.08 13:51
Titel: Re: Zufällige Zahlen des Dualsystems erzeugen
user profile iconRobert.Wachtel hat folgendes geschrieben Zum zitierten Posting springen:

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
user profile iconRobert.Wachtel hat folgendes geschrieben Zum zitierten Posting springen:
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
user profile iconplatzwart hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconRobert.Wachtel hat folgendes geschrieben Zum zitierten Posting springen:

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
user profile iconHastaLa hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconRobert.Wachtel hat folgendes geschrieben Zum zitierten Posting springen:
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
user profile iconRobert.Wachtel hat folgendes geschrieben Zum zitierten Posting springen:
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
user profile iconub60 hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconRobert.Wachtel hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconHastaLa hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconHastaLa hat folgendes geschrieben Zum zitierten Posting springen:
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
user profile iconRobert.Wachtel hat folgendes geschrieben Zum zitierten Posting springen:
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
user profile iconalzaimar hat folgendes geschrieben Zum zitierten Posting springen:
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
user profile iconRobert.Wachtel hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconalzaimar hat folgendes geschrieben Zum zitierten Posting springen:
Weisst Du auch, warum? [...]

Ja, steht ja schliesslich tausendfach schon im Internet...
Aber wieso schreibst Du dann
user profile iconRobert.Wachtel hat folgendes geschrieben Zum zitierten Posting springen:
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.


Robert.Wachtel - So 23.11.08 16:40
Titel: Re: Zufällige Zahlen des Dualsystems erzeugen
user profile iconalzaimar hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconRobert.Wachtel hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconalzaimar hat folgendes geschrieben Zum zitierten Posting springen:
Weisst Du auch, warum? [...]

Ja, steht ja schliesslich tausendfach schon im Internet...
Aber wieso schreibst Du dann
user profile iconRobert.Wachtel hat folgendes geschrieben Zum zitierten Posting springen:
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.

Nun, meine unklare Erklärung habe ich ja revidiert - wurde von Dir ja auch zitiert.


ub60 - So 23.11.08 17:13

user profile iconalzaimar hat folgendes geschrieben Zum zitierten Posting springen:

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:

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

user profile iconub60 hat folgendes geschrieben Zum zitierten Posting springen:
Das stimmt so auch nicht. Ich habe mir mal die Sourcen angesehen...
Doch, es stimmt haargenau. Kannst Du nicht lesen? :lol:

user profile iconub60 hat folgendes geschrieben Zum zitierten Posting springen:
...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
user profile iconalzaimar hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconTilman hat folgendes geschrieben Zum zitierten Posting springen:
... 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?