amiga-news DEUTSCHE VERSION
.
Links| Forums| Comments| Report news
.
Chat| Polls| Newsticker| Archive
.

amiga-news.de Forum > Programmierung > Mathematisch-/Algorithmische Fragen [ - Search - New posts - Register - Login - ]

-1- [ - Post reply - ]

2008-02-14, 23:17 h

Reth
Posts: 1858
User
Hallo zusammen,

da ich immer wieder mal einen Algorithmus/eine Berechnung nicht gleich verstehe, dachte ich, ich mach mal nen Sammelthread dafür auf!

Und hier meine erste Frage:

Kann mir bitte jemand genau erklären, was bei den beiden Zufallszahlengeneratoren auf dieser Seite passiert (unter eigene Zufallsfunktion):

Zufallszahlen

Mich interessiert, was da passiert (also warum z.B. der Linksshift und das XOR etc.). Am besten wär es, wenn jmd. die ganze Berechnung von vorn bis hinten in Deutsch erklären kann (in Mathe stehts ja schon da!)!

Vielen Dank schon einmal!

Ciao

[ - Answer - Quote - Direct link - ]

2008-02-15, 12:56 h

DrNOP
Posts: 4118
User
Nun ja, was dort passiert ist ja nicht so schwer zu durchschauen. Deine Frage bezieht sich wohl eher auf das warum, nicht? ;)

Das, was der dort "gängigen Algorithmus" nennt ist mir zum Beispiel völlig unbekannt. Das kann aber durchaus daran liegen, daß ich seltenst mit Fließkommazahlen arbeite - und bei Ganzzahlen macht der Wertebereich von -1 bis +1 nicht so richtig viel Sinn ... :D

Jedenfalls ist der Witz an der Sache, daß du aus einem begrenzten Spektrum an Eingabewerten (x, Seed) die volle Bandbreite an Ausgabewerten erzeugen willst. Dazu kannst du sie nicht einfach addieren, sonst ist ziemlich vorhersehbar welches Ergebnis bei einer bestimmten Eingabe herauskommt und zusätzlich sind Ein- und Ausgabewerte proportional.

Du hast also zwei Probleme:

  • Du willst die Proportionalität von Ein- und Ausgabewert auflösen (i.e. Eingabewert um eins erhöhen soll nicht eine proportionale Erhöhung des Ausgabewerts erzeugen)
  • Am liebsten wäre dir, wenn das Ergebnis völlig unabhängig von der Eingabe wäre


Den zweiten Punkt kann man nicht auflösen, immerhin wird diese (Pseudo- übrigens) Zufallszahl ja berechnet. Aber man kann es durch geeignete Maßnahmen soweit verstecken, daß jemand, der nicht die Rechenvorschrift vorgelegt bekommt, nicht draufkommt wie es berechnet worden ist.

Was da also gemacht wird dient diesen beiden Zwecken.
--
Signaturen mit mehr als zwei Zeilen gehen mir auf den Wecker

[ - Answer - Quote - Direct link - ]

2008-02-15, 13:57 h

Der_Wanderer
Posts: 1229
User
Der gängigste Algo zur Zufallszahlenberechnung ist wohl das Schieberegister. Das Schieberegister erfüllt fast alle Kriterien, die man an eine Zufallsfolge stellt. Aber um das wirklich komplett alles zu verstehen, musst du schon Lineare Algebra und möglichst auch Kryptologie an der Uni gehört haben.

Aber ich kann die einen anderen, wesentlich einfacheren Algo erklären, der braucht nicht so viel Mathematik.
Stell dir vor, wir bewegen uns im Modulo 7 Raum.

Der Zufallszahlengenerator könnte dann so aussehen:

seed = seed * 3 + 1

"seed" ist hier gleichzeitig der Zustand des Zuffies und auch der Ausgabe Wert. Möchte man andere Wertebereiche haben als der seed besitzt, muss man entsprechend scalieren oder ausmaskieren.

Also, fangen wir mit seed = 1 an.
Dann erhalten wir folgende Pseudo-Zufallsfolge:
seed = 1
seed = 1 * 3 + 1 = 4
seed = 4 * 3 + 1 = 13 mod 7 = 6
seed = 6 * 3 + 1 = 19 mod 7 = 5
seed = 5 * 3 + 1 = 16 mod 7 = 2
seed = 2 * 3 + 1 = 7 mod 7 = 0
seed = 0 * 3 + 1 = 1

Ist jetzt nicht ganz optimal, aber das Prinzip ist klar.

Einen guten Zuffie kannst du so machen:

seed = seed * 196314165 + 907633515

wobei seed ein 32bit integer sei sollte. Die Zahlen sind so ausgeknobelt, dass man bei mod 2^32 eine möglichst lange Sequenz von Zahlen bekommt, bis es sich wiederholt.
Das benutze ich in PerlinFX und auch als White Noise generator in Sweeper. Das Ohr und das Auge sind extrem empfindlich wenn es um Muster geht, die ein nicht ganz perfekter Zuffie generiert, also wenn du z.B. andere Zahlen wählst, dann fällt das schnell auf. Bei obigem Alog hatte ich aber keinerlei Probleme.

Wenn du jetzt Zufallzahlen zwischen 0 und 1 brauchst, machst du einfach:

float value = (float)seed / (float)0xFFFFFFFF

wobei dann value ein Float sein sollte und seed unsigned int.

--
Thilo Köhler, Author von:
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, TK AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de


[ - Answer - Quote - Direct link - ]

2008-02-15, 15:08 h

Reth
Posts: 1858
User
Danke erst einmal für eure Antworten!

@DrNOP:
Genau das warum wäre wichtig!
Warum der Linksshift? Warum die Addition von 57 (is ja keine Primzahl)? Usw. usf.


@Der_Wanderer:
Zitat:
Original von Der_Wanderer:
Der gängigste Algo zur Zufallszahlenberechnung ist wohl das Schieberegister. Das Schieberegister erfüllt fast alle Kriterien, die man an eine Zufallsfolge stellt. Aber um das wirklich komplett alles zu verstehen, musst du schon Lineare Algebra und möglichst auch Kryptologie an der Uni gehört haben.


Hatte ich (2 Semester LA, 1 Semester Krypto) und ein Schieberegister ham wir uns damals in Hardware angesehen (mit FlipFlops usw.).
Allerdings ist das schon soooooo lange her, dass ich keinen Plan mehr davon habe (ebenso wie von Signalverarbeitung mit Hilfe von Abtasten, FFT usw.; Polynomdivision; Integralen; theor. Informatik - leider).
Das Einzige was ich in meinem bisherigen Berufsleben einmal wieder ausgraben konnte war etwas Graphenalgorithmen (Kreissuche). Das hat Spass gemacht!

Vielleicht kann man ja versuchen mir zu erklären, was da passiert?

Zitat:
Aber ich kann die einen anderen, wesentlich einfacheren Algo erklären, der braucht nicht so viel Mathematik.
Stell dir vor, wir bewegen uns im Modulo 7 Raum.

Der Zufallszahlengenerator könnte dann so aussehen:

seed = seed * 3 + 1

"seed" ist hier gleichzeitig der Zustand des Zuffies und auch der Ausgabe Wert. Möchte man andere Wertebereiche haben als der seed besitzt, muss man entsprechend scalieren oder ausmaskieren.

Also, fangen wir mit seed = 1 an.
Dann erhalten wir folgende Pseudo-Zufallsfolge:
seed = 1
seed = 1 * 3 + 1 = 4
seed = 4 * 3 + 1 = 13 mod 7 = 6
seed = 6 * 3 + 1 = 19 mod 7 = 5
seed = 5 * 3 + 1 = 16 mod 7 = 2
seed = 2 * 3 + 1 = 7 mod 7 = 0
seed = 0 * 3 + 1 = 1

Ist jetzt nicht ganz optimal, aber das Prinzip ist klar.


Bis hierher kann ich folgen.

Zitat:
Einen guten Zuffie kannst du so machen:

seed = seed * 196314165 + 907633515

wobei seed ein 32bit integer sei sollte. Die Zahlen sind so ausgeknobelt, dass man bei mod 2^32 eine möglichst lange Sequenz von Zahlen bekommt, bis es sich wiederholt.


Und das funktioniert, obwohl die beiden Zahlen keine Primzahlen sind?

Ciao

[ - Answer - Quote - Direct link - ]

2008-02-15, 15:24 h

Der_Wanderer
Posts: 1229
User
Es müssen keine Primzahlen sein. Das wäre nur der Fall, wenn wir das so berechnen:

zufallszahl = seed^n mod m

Dann muss seed "relativ prim" zu m sein.
Geht natürlich auch, ist aber aufwendiger zu berechnen.
--
Thilo Köhler, Author von:
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, TK AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de


[ - Answer - Quote - Direct link - ]

2008-02-15, 23:30 h

DrNOP
Posts: 4118
User
Zitat:
Original von Reth:
@DrNOP:
Genau das warum wäre wichtig!
Warum der Linksshift? Warum die Addition von 57 (is ja keine Primzahl)? Usw. usf.

Primzahl? Ich glaube, du denkst zu kompliziert. ;)

Der Linksshift ist erst mal eine billige Multiplikation. 57 ist eine "schräge" Zahl, die weder eine Primzahl ist noch eine Zweierpotenz oder sonst irgendwas, was man auf andere Weise herleiten könnte.

Nochmal:
Die exakten Werte, die da stehen, sind nicht wichtig um das Prinzip zu verstehen. Wenn du das Prinzip verstanden hast, kannst du dir auch andere Werte suchen. Dann allerdings mußt du selbst sicherstellen, daß dein Algorithmus "gut genug" ist - oder du nimmst die Werte, die da schon stehen und glaubst denen, die sie aufgeschrieben haben, daß sie schon genügend Versuche mit genügend Werten gemacht haben, um exakt diese Werte anzupreisen. ;)
Aber wahrscheinlich haben sie keine Versuche gemacht, sondern mittels Uni-Mathematik ausgerechnet... :P
--
Signaturen mit mehr als zwei Zeilen gehen mir auf den Wecker

[ - Answer - Quote - Direct link - ]


-1- [ - Post reply - ]


amiga-news.de Forum > Programmierung > Mathematisch-/Algorithmische Fragen [ - Search - New posts - Register - Login - ]


.
Masthead | Privacy policy | Netiquette | Advertising | Contact
Copyright © 1998-2024 by amiga-news.de - all rights reserved.
.