Hallo,
weiß jemand, ob es eine mathematische Funktion gibt, mit der man
Pseudozufallszahlen generieren kann, also eine Funktion in der Form
y = f(x)
Wobei y dann die Pseudozufallszahl zum jeweiligen x ist.
Stefan schrieb:> weiß jemand, ob es eine mathematische Funktion gibt, mit der man> Pseudozufallszahlen generieren kann
Ja, gibt es. Sonst würde es ja keine Pseudozufallszahlengeneratoren
geben und auch keine Pseudozufallszahlen.
> also eine Funktion in der Form>> y = f(x)>> Wobei y dann die Pseudozufallszahl zum jeweiligen x ist.
Am einfachsten:
y = seed
Hast schonmal den Wikipedia-Artikel gelesen?
Wird über linear rückgekoppelte Schieberegister "errechnet". Ob bzw. wie
man das als "Formel" bezeichnen kann, überlasse ich den Mathematikern.
Ich muß mir sowas eher technisch, als Hardware oder Programm,
vorstellen, um es zu verstehen.
Also ne mathematische Funktion y = f(x) kann es so in dem Sinne nicht
geben, den die ist deterministisch und Zufallszahlen sollen ja gerade
nicht deterministisch sein.
Anders gesagt: Wenn du ne feste mathematische Funktion wie y = x² + 2x -
5 hast, dann kannst du die beliebig oft ausrechnen und es wird jedesmal
für das gleiche x auch das gleiche y rauskommen.
Das gilt auch für Differentialgleichungen, Integrale und was es da sonst
noch gibt.
Wenn du jetzt ne Pseudozufallszahl haben willst, dann gibts da
verschiedene Verfahren, das rückgekoppelte Schieberegister wurde schon
genannt.
Das ist auch deterministisch, mit dem gleichen Startwert kommt immer die
gleiche Zufallszahlenfolge raus.
Die Zufallszahlen sind also in sich schon zufällig (in dem Sinne, dass
alle Zahlen des Intervalls gleich große Wahrscheinlichkeit haben, wie
bei einem fairen Würfelwurf). Aber die Zahlen sind trotzdem vorhersagbar
und taugen daher nicht für Krypto.
y = rand(seed); ist sowas. Zumindest meistens, Doku lesen.
Es gibt noch die häufig eingesetzte Lösung y = rand(seed) wobei seed ein
tatsächlich komplett zufälliger Wert ist, der jedesmal neu gewählt wird.
Beliebt: Seed von Random.org holen. Aber dann mehrfach und daraus nen
Hash berechnen und die Hashes dürfen nicht gleich sein. Es gab mal den
Fall wo random.org down war und die Seeds waren alles Hashes der 404
Fehlermeldung. Da hat sich dann irgendein schlauer Mensch selbst 1000
Bitcoins überwiesen ;)
Weitere Quellen für Zufälligkeit (Entropie genannt):
- Maus- und Tastaturereignisse mitschneiden, in eine Integer-Zahl
verwursten, daraus nen Hash berechnen
- Zeit in ms seit Rechner- bzw. Programmstart
- Absolute Uhrzeit in Unix-millisekunden
- MAC-Adresse und IP des primären Netzwerkadapters zu nem Hash
verwursten
usw usw
Danke für die Antworten!
THOR schrieb:> Anders gesagt: Wenn du ne feste mathematische Funktion wie y = x² + 2x -> 5 hast, dann kannst du die beliebig oft ausrechnen und es wird jedesmal> für das gleiche x auch das gleiche y rauskommen.
Genau so war die Frage gemeint.
Gibt es eine Formel wie z.B.
y = (3*x^(x+2)+5*x^(x+4)+7*x^(x+6))/(2*x^(x+1)+4*x^(x+3)+6*x^(x+5))
die für jedes x eine feste "Zufallszahl" y ausspuckt?
Stefan schrieb:> Gibt es eine Formel wie z.B.>> y = (3*x^(x+2)+5*x^(x+4)+7*x^(x+6))/(2*x^(x+1)+4*x^(x+3)+6*x^(x+5))>> die für jedes x eine feste "Zufallszahl" y ausspuckt?
warum nicht einfach eine lookup-table?
Stefan schrieb:> Gibt es eine Formel wie z.B.>> y = (3*x^(x+2)+5*x^(x+4)+7*x^(x+6))/(2*x^(x+1)+4*x^(x+3)+6*x^(x+5))>> die für jedes x eine feste "Zufallszahl" y ausspuckt?
Nicht in der Art, aber eine Hashfunktion macht das.
Stefan schrieb:> weiß jemand, ob es eine mathematische Funktion gibt, mit der man> Pseudozufallszahlen generieren kann, also eine Funktion in der Form>> y = f(x)>> Wobei y dann die Pseudozufallszahl zum jeweiligen x ist.
schau mal nach "Linear rückgekoppeltes Schieberegister" engl LFSR oder
"Maximum length sequence". Damit erzeugt man Sequenzen zufällig
verteilter Binärzahlen. x währe dann der Index in dieser Sequenz
generecht ab dem Initialisierung.
Die Mathematik dazu findet sich wohl unter dem Stichwort Galoisfelder
o.ä..
verdammt, zu spät dran mit bearbeiten.
Stefan schrieb:
> Gibt es eine Formel wie z.B.>> y = (3*x^(x+2)+5*x^(x+4)+7*x^(x+6))/(2*x^(x+1)+4*x^(x+3)+6*x^(x+5))>> die für jedes x eine feste "Zufallszahl" y ausspuckt?
da für jedes x eine "feste Zufallszahl" gefragt ist, erfüllt jede
injektive funktion die genannte bedingung.
im einfachsten fall: y = x
Daniel F. schrieb:> verdammt, zu spät dran mit bearbeiten.>> Stefan schrieb:>> Gibt es eine Formel wie z.B.>>>> y = (3*x^(x+2)+5*x^(x+4)+7*x^(x+6))/(2*x^(x+1)+4*x^(x+3)+6*x^(x+5))>>>> die für jedes x eine feste "Zufallszahl" y ausspuckt?>> da für jedes x eine "feste Zufallszahl" gefragt ist, erfüllt jede> injektive funktion die genannte bedingung.>> im einfachsten fall: y = x
Etwas allgemeiner ausgedrückt: y kann nur so zufällig sein wie x. Oder
im Fachterminus: Die Entropie lässt sich mit deterministischen
Funktionen nicht steigern.
Daher ist in der Praxis Entropiegewinnung äußerst wichtig. Die gesamte
Kryptographie hat das Problem, dass Computer deterministisch sind (also
wie y=x).
y=sin(x) ausrechnen und dann die 4., 5. und 6 Stelle nach dem Komma
verwenden. Den Rest wegwerfen. x wahlweise als fortlaufenden Wert oder
das y verwenden. Das hat für die Spielprogrammierung unter der Bank in
der Berufsschule (vor 30 Jahren) ausgereicht.
nixundnul schrieb:> Das hat für die Spielprogrammierung unter der Bank in> der Berufsschule (vor 30 Jahren) ausgereicht.
Ein genialer mathematischer Beweis ...
SCNR
@Stefan:
By the way, aus welcher Zahlenmenge, bzw Definitionsbereich soll denn x
und y sein?
N, R, Z, ...?
Oder beschreibe einfach mal dein eigentliches Problem.
Der Andere schrieb:> nixundnul schrieb:>> Das hat für die Spielprogrammierung unter der Bank in>> der Berufsschule (vor 30 Jahren) ausgereicht.>> Ein genialer mathematischer Beweis ...>> SCNR
war der gefragt? Schließlich geht es um Pseudo-Zufallszahlen. Und
rückgekoppeltes Schieberegister ist deterministisch und wiederholt sich
auch. Es geht (mir) eher darum, wie man in einer gegebenen
Programmiersprache mit dem wenigsten Aufwand ein ausreichendes
Ergebnis erzielt. Programmiersprache und Anforderungen kennen wir nicht.
GOTO 10.
(damals war es SHARP1210-Basic)
Stefan schrieb:> weiß jemand, ob es eine mathematische Funktion gibt, mit der man> Pseudozufallszahlen generieren kann, also eine Funktion in der Form
ja. gibt es. Man sollte nur wissen, wozu man die Zufallszahlen benötigt.
Für Verschlüsselung braucht es andere ufallszahlen wie für statistische
Testverfahren.
Schreiber schrieb:> Stefan schrieb:>> weiß jemand, ob es eine mathematische Funktion gibt, mit der man>> Pseudozufallszahlen generieren kann, also eine Funktion in der Form>> ja. gibt es. Man sollte nur wissen, wozu man die Zufallszahlen benötigt.> Für Verschlüsselung braucht es andere ufallszahlen wie für statistische> Testverfahren.
Die meisten Antworten sind so blöd, wie die von Schreiber.
Hier ein Link zur Frage:
http://www.math.uni-frankfurt.de/~numerik/lehre/Vorlesungen/Comp_Fin09/skript/n-shell3.pdf
Baldrian schrieb:> Schreiber schrieb:>> Stefan schrieb:>>> weiß jemand, ob es eine mathematische Funktion gibt, mit der man>>> Pseudozufallszahlen generieren kann, also eine Funktion in der Form>>>> ja. gibt es. Man sollte nur wissen, wozu man die Zufallszahlen benötigt.>> Für Verschlüsselung braucht es andere ufallszahlen wie für statistische>> Testverfahren.>> Die meisten Antworten sind so blöd, wie die von Schreiber.
Der Schreiber hat aber schon recht, es gibt unterschiedliche
Anforderungen an Pseudozufallsreihen. Und das meint nicht nur die
spektralen Eigenschaftzen sondern auch den Ressourcenbedarf bei der
Generierung.
> http://www.math.uni-frankfurt.de/~numerik/lehre/Vo...
Naja mit der Forderung nach Unverhersehbarkeit (s. S.46) schliessen die
schon mal die in der Praxis häufig verwenden Generatoren aus. Es geht ja
hier um Pseudozufall und nicht Zufall im Sinne der ergrauten
Mathematiker im universitären Elfenbeinturm.
Stefan schrieb:> Hallo,>> weiß jemand, ob es eine mathematische Funktion gibt, mit der man> Pseudozufallszahlen generieren kann, also eine Funktion in der Form>
Nein, es gibt nicht nur "eine", sondern es gibt "viele" verschiedene
Algorithmen(Funktionen) zur Ermittlung von Pseudo-Zufallszahlen.
Allen gemeinsam ist, dass sie einen "Startwert " (Seed) eingebaut haben,
mit dem der Algorithmus startet, bei jedem Funktionsaufruf w wird nicht
nur eine neue Pseudo-Zufallszahl ermittelt, sondern auch die Bits des
"Seed" durcheinander gewürfelt, mit dem dann weitergerechnet wird.
Jede Programmiersprache hat einen Pseudo-Zufallszahlengenerator
eingebaut, oft mit dem Namen "rand()" oder "random()", die Du benutzen
kannst.
Abhängig von der Mikrocontroller-Plattform kann es allerdings auch sein,
dass Du mit der Software nicht nur einen Funktionsaufruf für die
Ermittlung einer Pseudo-Zufallszahl verwenden kannst, sondern dass die
Controller-Hardware einen True-Random-Number-Generator bereitstellt, aus
dem Du per Funktionsaufruf eine echte Zufallszahl statt einer
Pseudo-Zufallszahl bekommst.
Worauf beziehst Du Deine Frage genaau?
Suchst Du eine (einfache?) Funktion als Zufallszahlengeneratorfunktion
in einer bestimmten Programmiersprache? Oder suchst Du den Namen einer
Zufallszahlengeneratorfunktion für eine bestimmte Plattform?
THOR schrieb:> MAC-Adresse und IP des primären Netzwerkadapters zu nem Hash> verwursten
Beides ist, zumindest bei mir, nicht entropiebehaftet sondern immer
identisch (zumindest auf meinem Rechner).
nixundnul schrieb:> y=sin(x) ausrechnen und dann die 4., 5. und 6 Stelle nach dem Komma> verwenden.
Mit etwas Überlegen finden sich bestimmt noch umständlichere Verfahren,
die sich auf einem uC noch schlechter implementieren lassen.
Warum das einfach zu implementierende bitweise Schieberegister nehmen,
welches mit ein paar Shifts und Xors auskommt, wenn man so richtig
Rechenzeit und Speicher verschwenden kann?
Stefan schrieb:> weiß jemand, ob es eine mathematische Funktion gibt, mit der man> Pseudozufallszahlen generieren kann, also eine Funktion in der Form>> y = f(x)>> Wobei y dann die Pseudozufallszahl zum jeweiligen x ist.
Jein.
Ein Pseudozufallsgenerator ist idR. nicht als Funktion implementiert,
insbesondere nimmt er keinen Parameter (x) entgegen. Das hat auch keinen
Sinn, weil man ja ein zufälliges Ergebnis haben will. Wenn das
Ergebnis direkt vom Parameter x abhängig wäre, dann wäre es nicht
zufällig. Und wenn es nicht von x abhängig ist, dann braucht man x auch
nicht erst zu übergeben.
Wenn real existierende Zufallszahlenfunktionen Parameter nehmen, dann
nicht um den Zufall zu beeinflussen, sondern um den Wertebereich
einzugrenzen, aus dem die Funktion eine Zahl zufällig wählt.
Die meisten Zufallszahlengeneratoren sind so implementiert, daß sie
einen internen Zustand haben. Bei jedem Abruf einer Zufallszahl wird der
interne Zustand durcheinandergewürfelt und im Ganzen oder teilweise
zurückgegeben. Zur Initialisierung des internen Zustanden gibt es meist
eine eigene Funktion, oft mit einem Namen ähnlich wie rand_seed()
Bei den schon genannten linear rückgekoppelten Schieberegistern ist der
Inhalt des Schieberegisters der interne Zustand. Und bei jedem
Taktschritt fällt ein Bit als zufällige Zahl heraus.
Eine andere weit verbreitete Implementierung ist der lineare
Kongruenzgenerator (LCG). Der interne Zustand ist eine Integerzahl, z.B.
uint32. Bei jedem Aufruf wird aus dem alten Zustand x_i der neue Zustand
x_i+1 durch eine einfache lineare Operation gebildet:
x_i+1 = (a*x_i + c) mod m
a, c und m sind dabei so gewählt, daß der Generator die größtmögliche
Periode m hat. Beispiele siehe z.B. hier:
https://en.wikipedia.org/wiki/Linear_congruential_generator#Parameters_in_common_use
Speziell bei einem µC stellt sich das Problem der Initialsierung des
Zufallsgenerators. Denn nach dem Einschalten der Stromversorgung werden
alle Variablen mit definierten Werten initialisiert. Der Generator
liefert dann immer die gleiche Zahlenfolge. Wenn man das ändern will,
muß man sich irgendwie einen echt zufälligen Startwert beschaffen.
Axel S. schrieb:> peziell bei einem µC stellt sich das Problem der Initialsierung des> Zufallsgenerators. Denn nach dem Einschalten der Stromversorgung werden> alle Variablen mit definierten Werten initialisiert. Der Generator> liefert dann immer die gleiche Zahlenfolge. Wenn man das ändern will,> muß man sich irgendwie einen echt zufälligen Startwert beschaffen.
das kann man mit einem A/D machen der zB. das Rauschen einer Diode
misst.
Oder ich bilde eine CRC über den RAM Bereich der ja dann rein zufällige
Werte hat, sofern er nicht systematisch geleert wird. Oder Oder Oder
Stephan schrieb:> Axel S. schrieb:>> liefert dann immer die gleiche Zahlenfolge. Wenn man das ändern will,>> muß man sich irgendwie einen echt zufälligen Startwert beschaffen.>> das kann man mit einem A/D machen der zB. das Rauschen einer Diode> misst.
Da ein AD-Wandler nur eine begrenzte Auflösung hat, beispielsweise 8bit
oder ^10Bit und damit nur einen sehr begrenzten Wertebereich (256, 1024
Elemente) aufweist ist das wohl kaum als "echt zufälliger Startwert" zu
bezeichnen.
der "echte" ist doch nur echt, weil nicht vorhersehbar. Das ist doch
durch zB. das Rauschen gegeben. Ich glaube Intel hat sowas auch in den
CPU mal gemacht. Dann kann ich doch damit weiterrechnen wie ich will.
Axel S. schrieb:> Ein Pseudozufallsgenerator ist idR. nicht als Funktion> implementiert, [...]
... wobei auch das ohne weiteres moeglich ist.
Im Zusammenhang mit dem DES habe ich gelesen, dass es
umfangreiche Untersuchungen gibt, die seine Qualitaeten
als Pseudozufallszahlengenerator belegen.
Possetitjel schrieb:> Im Zusammenhang mit dem DES habe ich gelesen, dass es> umfangreiche Untersuchungen gibt, die seine Qualitaeten> als Pseudozufallszahlengenerator belegen.
Ja weil des ja ein Qualitätsmerkmal eines guten Encoders ist. Dessen
Output ist mit statistischen Mitteln nicht von Rauschen unterscheidbar,
alle statistischen Eigenschaften des plain textes wie
Buchstabenhäufigkeit sind durch das Codieren "entfernt".
Jürgen S. schrieb:> Stefan schrieb:> Abhängig von der Mikrocontroller-Plattform kann es allerdings auch sein,> dass Du mit der Software nicht nur einen Funktionsaufruf für die> Ermittlung einer Pseudo-Zufallszahl verwenden kannst, sondern dass die> Controller-Hardware einen True-Random-Number-Generator bereitstellt, aus> dem Du per Funktionsaufruf eine echte Zufallszahl statt einer> Pseudo-Zufallszahl bekommst.>
genau, z.B. der RNG im STM32F4xx.
Allerdings wird der TO ja (hoffentlich) wissen, warum er EXPLIZIT nach
einem Pseudrandomgenerator gefragt hat...
Ruediger A. schrieb:> Allerdings wird der TO ja (hoffentlich) wissen, warum er EXPLIZIT nach> einem Pseudrandomgenerator gefragt hat...
Hat er ja noch nichtmal. Das ist nur im Betreff falsch angegeben.
Deshalb verstehe ich die Diskussion über Startwerte nicht. Er braucht
keinen Startwert.
Anscheinend will er eine Funktion, die Eingabewerte auf zufällig
scheinende Ausgabewerte abbildet.
Deshalb der Vorschlag mit den Hasfunktionen. Die machen genau sowas.
Die letzten vier Stellen von MD5 zum Beispiel ergeben
0->64da
1->849b
2->862c
3->baf3
Die Eingangsfolge ist linear, die Ausgangsfolge 'zufällig' verteilt.
Da er nicht geschrieben hat, wofür er das braucht, muss er selber
entscheiden wie die Abwägung zwischen Berechnungsaufwand und
'Zufälligkeit' ausfällt.
DraconiX schrieb:> y = rand() % Bereich;
STOP! Das erzeugt keine gleichverteilten Zufallszahlen!
Die erste Frage sollte sein: Wofür brauchst du die Zahlen?
- Elektronischer Würfel?
- Krypto-Anwendung?
Md M. schrieb:> Dimpel schrieb:>> Ich brauch die Lottozahlen für die kommende Ziehung, hat da wer was?>> Findest du in der Zahl Pi irgendwo hinterm Komma.
Mal so ein bisschen abseits vom Thema, ist das eigentlich bewiesen? Es
könnte ja sein, dass Pi irgendwann zum Beispiel nur noch aus
10100100010000 und so weiter besteht. Dann wäre es immer noch
irrational, würde aber nicht alle Informationen enthalten.
Ich kenne das Problem. Die Vorschläge zu Rauschen, Wetterereignissen,
etc. nutzen ja nicht viel, da eine Funktion y = f(x) gefragt ist, d.h.
reproduzierbar gleiche Ausgabe bei gleicher Eingabe. Wobei die Ausgabe,
wenn man 1, 2, 3, 4, 5, ... reinsteckt, eben möglichst (wie man das auch
immer definiert) "zufällig" sein soll.
Beispiel aus der Praxis: Man hat zwei getrennte Geräte und in jedem
läuft eine Uhr und man möchte zufällige Ereignisse haben, die bei beiden
Geräten gleichzeitig auftreten. Dann könnte man mit so einer Funktion,
die die Zeit als Eingabe hat, solchen Zufall erzeugen.
Vorschläge wie die x. Stelle von Pi sind nicht so gut, da die Laufzeit
eines solchen Algorithmus immer größer wird, je mehr Zeit vergeht.
Der Vorschlag mit der 3-5. Nachkommastelle des Sinus ist drollig.
Wahrscheinlich wird das Beste in der Tat irgendeine solche oder ähnlich
Hash-Funktion sein. Je nach Mikrocontroller müsste es halt
ressourcenschonend sein. Das kann man sich dann mal überlegen.
Vielleicht meldet sich der OP ja nochmal.
Marek N. schrieb:> Such mal nach m-Folge Generator oder linear rückgekoppletes> Schieberegister.
Wurde in diesem Thread jetzt schon öfter genannt. Wie oft denn noch? Ja
damit kann man Pseudozufallszahlen generieren. Es kommt aber auch bei
jedem Durchlauf das gleiche raus.
Du setzt dann aber voraus, dass die Geräte ständig laufen.
Wenn eines aber mal ausgeschaltet ist und dann neu gestartet wird,
sollte man höchstens die Zeit richtig stellen müssen. Der inneren
Zustände der Schieberegister wären dann trotzdem nicht synchron. Kannst
du folgen?
Frank N. Stein schrieb:> Dann könnte man mit so einer Funktion,> die die Zeit als Eingabe hat, solchen Zufall erzeugen.
Nein, das ist eben deshalb schon mal kein Zufall.
√π schrieb:> Es kommt aber auch bei> jedem Durchlauf das gleiche raus.
Das ist eben pseudo. Genau das, was der TO möchte.
Gruß
Jobst
Hallo!
Dussel schrieb:> Md M. schrieb:>> Dimpel schrieb:>>> Ich brauch die Lottozahlen für die kommende Ziehung, hat da wer was?>>>> Findest du in der Zahl Pi irgendwo hinterm Komma.> Mal so ein bisschen abseits vom Thema, ist das eigentlich bewiesen? Es> könnte ja sein, dass Pi irgendwann zum Beispiel nur noch aus> 10100100010000 und so weiter besteht. Dann wäre es immer noch> irrational, würde aber nicht alle Informationen enthalten.
Nein, ist nicht bewiesen. Pi ist zwar irrational und transzendent (und
damit nicht periodisch), aber ob Pi normal ist oder nicht ist noch nicht
sicher ( https://de.wikipedia.org/wiki/Normale_Zahl ), wenn auch
wahrscheinlich (laut Analyse der ersten 6 Milliarden Stellen).
Schöne Grüße,
Martin
THOR schrieb:> Also ne mathematische Funktion y = f(x) kann es so in dem Sinne nicht> geben, den die ist deterministisch und Zufallszahlen sollen ja gerade> nicht deterministisch sein.
Es wurde nach PSEUDO-Zufallszahlen gefragt. Und diese (bzw. eine
entsprechende Folge) hat eben die Eigenschaft, dass die reproduzierbar
ist.
> Anders gesagt: Wenn du ne feste mathematische Funktion wie y = x² + 2x -> 5 hast, dann kannst du die beliebig oft ausrechnen und es wird jedesmal> für das gleiche x auch das gleiche y rauskommen.
Ganau. Und sowas o.ä. sucht der OP, wobei er eigentlich eine
Hash-Funktion meint, d.h. das Ergebnis von f(x) ist deterministisch,
aber "wüst" verstreut, idealerweise einer vorgegebenen Verteilung wie
Gleichverteilung oder Normalverteilung folgend.
> Das gilt auch für Differentialgleichungen, Integrale und was es da sonst> noch gibt.
Es gibt noch viiiel mehr :-)
> y = rand(seed); ist sowas. Zumindest meistens, Doku lesen.
Nein, denn rand(seed) ist KEINE mathematische Funktion:
Eine mathematische Funktion liefert für eine gegebene Eingabe eine
entsprechende Ausgabe. Beispiel: f(x) = x². Egal, zu welcher Uhrzeit
oder bei welchem Wetter oder auf welchem Planeten du diese Funktion
auswertest, wenn x gleich bleibt, dann tut es auch f(x).
Johann, hast du eine Idee zu einer solchen Hash-Funktion, wie von dir
beschrieben? Also möglichst ressourcenschonend (wenige Zyklen) für einen
AVR? Am besten sollte ein uint32_t rauskommen. Ich hätte eine Verwendung
dafür. :)
Frank N. Stein schrieb:> Wenn eines aber mal ausgeschaltet ist und dann neu gestartet wird,> sollte man höchstens die Zeit richtig stellen müssen.
Dann nimm halt einen MD5-Hash über die Zeit.
Nur, was machst Du, wenn die eine Uhr 2 Sekunden nachgeht?
Wenn die eine Uhr 2 Sekunden nachgeht, weil vom Anwender falsch
gestellt: Sein Pech.
Wenn die Uhr falsch geht, weil die Quarze nicht ganz synchron laufen:
Dann nützt auch ein anderer Pseudozufallsgenerator nix.
MD5 ist aber ganz schön heavy für einen AVR. ;)
In dem Buch "Kryptografie" von Klaus Schmeh findest Du eine Reihe von
Verfahren zuzüglich Erklärung, welche Verfahren wofür eingesetzt werden.
Dazu gehören auch Verfahren mit geringem Rechenaufwand für
schwachbrüstige CPUs.
Frank N. Stein schrieb:> Johann, hast du eine Idee zu einer solchen Hash-Funktion, wie von dir> beschrieben? Also möglichst ressourcenschonend (wenige Zyklen) für einen> AVR? Am besten sollte ein uint32_t rauskommen. Ich hätte eine Verwendung> dafür. :)
Ich poste hier jetzt einfach mal eine random-number-Generatorfunktion,
die speziell für Arduino vorgesehen ist und einen unsigned int (16-bit)
im Wertebereich 0 bis 65535 erzeugt:
// create a random integer from 0 - 65535
unsigned int rng() {
static unsigned int y = 0;
y += micros(); // seeded with changing number
y ^= y << 2; y ^= y >> 7; y ^= y << 7;
return (y);
}
Auf den als static-VVariable gehaltene Seed-Wert "y" wird bei jedem
Funktionsaufruf der Stand des Arduino-Mikrosekundenzählers draufaddiert,
so dass jedesmal mit einem anderen seed gerechnet wird.
Die Funktion ist sehr schnell, also wenn Du statt eines 16-bit
Ergebnisses lieber ein 32-bit Ergebnis haben möchtest, lass die Funktion
einfach zweimal laufen und schiebe die 2*16-Bit zu einem 32-Bit Wert
zusammen.
Und wenn es allgemein für AVR sein soll und nicht für Arduino und Du
daher die micros() Funktion nicht zur Verfügung hast, dann würde ich
statt micros einfach immer wechselnde Werte auf y draufaddieren, zum
Beispiel immer eine der ersten hundert Primzahlen, die zu dem Zweck
reihum aus einem Ringpuffer gezogen wird.
Stefan (Gast) will:
> y = f(x)> Wobei y dann die Pseudozufallszahl zum jeweiligen x ist.> Gibt es eine Formel wie z.B.> y = (3*x^(x+2)+5*x^(x+4)+7*x^(x+6))/(2*x^(x+1)+4*x^(x+3)+6*x^(x+5))> die für jedes x eine feste "Zufallszahl" y ausspuckt?
Wie schon oben teilweise erkennbar, gibt es Unmengen von
"Rechenvorschriften" die aus einer Zahl eine andere machen können,
wo der Zusammenhang von Eingabe und Ausgabe nicht leicht erkennbar
ist. In der Sprache C kann man das als eine Function
implementieren, ist also eine Funktion.
Dabei muss man sich aber auf die Bitlänge der Zahl festlegen,
sonst ist es nicht programmierbar.
Wenn du jetzt nur aus jedem Input-Wert eine bunte LED-Ansteuerung
machen willst, bist du mit einem LFSR und NULL-Umgehung schon
gut bedient.
FERTIG.
Wenn du aus der "Zufallszahl" aber auch wieder die Eingabe-
Zahl zurückgewinnen willst, oder eine EINDEUTIGE (!) Zuordnung
von Eingabe zu "Zufallszahl" haben willst, darfs du nicht nach
Zufallszahlen fragen, sondern nach VERSCHLÜSSELUNG.
Dann wird vielleicht auch die Zahl der Schlaumeier-Beiträge
reduziert. ;-)
Stefan schrieb:> Hallo,>> weiß jemand, ob es eine mathematische Funktion gibt, mit der man> Pseudozufallszahlen generieren kann, also eine Funktion in der Form>> y = f(x)>> Wobei y dann die Pseudozufallszahl zum jeweiligen x ist.http://apps.nrbook.com/c/index.html
Dann mal Section 7.7 ab Seite 309 lesen...
fchk
Wie wäre es mit ... schrieb:> n(1)=1234567890;> for i=2:1001> n(i) = mod (16807*n(i-1), 2147483647);> i = i+1;> end> n = n / 2147483647;
Der ergibt immer 0 — und zwar eine ziemlich teure. Im Prinzip ist es
keine schlechte Idee in einem endlichen Körper zu rechnen (hier GF(M31)
wobei M31 = 2147483647 = 2^31 - 1 eine Mersennesche Primzahl ist). Oben
wurden ja bereits LFSR vorgeschlagen, und mit irreduziblem Polynom ist
das i.d.R auch "nur" Arithmetik in GF(2^q).
Aber die Berechnung ist zu kompliziert, denn es wurd n * 16807^1000 mod
M31 berechnet, und K = 16807^1000 kann man auch direkt ausrechnen. Das
Verfahren reduziert sich also auf n -> (K * n) mod M31.
>> Findest du in der Zahl Pi irgendwo hinterm Komma.> Mal so ein bisschen abseits vom Thema, ist das eigentlich bewiesen? Es> könnte ja sein, dass Pi irgendwann zum Beispiel nur noch aus> 10100100010000 und so weiter besteht. Dann wäre es immer noch> irrational, würde aber nicht alle Informationen enthalten.
Das ist Pi garantiert in der 0b-Welt.