Autor Beitrag
HastaLa
Hält's aus hier
Beiträge: 3



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 895
Erhaltene Danke: 7

Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
BeitragVerfasst: 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1054
Erhaltene Danke: 78

Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
BeitragVerfasst: So 23.11.08 13:51 
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 Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: So 23.11.08 14:25 
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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 895
Erhaltene Danke: 7

Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
BeitragVerfasst: So 23.11.08 14:29 
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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 895
Erhaltene Danke: 7

Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
BeitragVerfasst: So 23.11.08 14:35 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 765
Erhaltene Danke: 130



BeitragVerfasst: So 23.11.08 14:40 
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 Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 895
Erhaltene Danke: 7

Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
BeitragVerfasst: So 23.11.08 14:56 
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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 895
Erhaltene Danke: 7

Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1314

Debian Squeeze, Win 7 Prof.
D7 Pers
BeitragVerfasst: 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?

_________________
If liberty means anything at all, it means the right to tell people what they do not want to hear. - George Orwell
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: So 23.11.08 16:22 
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.

_________________
Na denn, dann. Bis dann, denn.
Robert.Wachtel
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 895
Erhaltene Danke: 7

Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
BeitragVerfasst: So 23.11.08 16:23 
user profile iconalzaimar hat folgendes geschrieben Zum zitierten Posting springen:
Weisst Du auch, warum? [...]

Ja, steht ja schliesslich tausendfach schon im Internet...
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: So 23.11.08 16:37 
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.

_________________
Na denn, dann. Bis dann, denn.
Robert.Wachtel
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 895
Erhaltene Danke: 7

Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
BeitragVerfasst: So 23.11.08 16:40 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 765
Erhaltene Danke: 130



BeitragVerfasst: 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):
ausblenden 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: 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.

_________________
Na denn, dann. Bis dann, denn.
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: So 23.11.08 19:20 
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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1405
Erhaltene Danke: 51

Win 7, Android
Turbo Delphi, Eclipse
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: 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?

_________________
Na denn, dann. Bis dann, denn.