Hallo,
ja ich weiß es gibt schon mehrere Threads über dieses Thema, dennoch
bleiben mir ein paar ganz kleine Fragen offen !
und zwar habe ich aus diesem Thread
Beitrag "Re: Funk-Fernsteuerung (seriell)"
den Code genommen und in mein Programm eingefügt...
jetzt ist die Frage die ich habe, wie verwende ich diesen Befehl:
PMrand_seed((long int)time(NULL));
denn in dem beitrag steht folgendes:
=====
Zum Initialisieren wird meist time genommen, also:
PMrand_seed((long int)time(NULL));
Falls man time nicht zur Verfügung hat, dann muß man die Systemzeit in
Sekunden nehmen; jedenfalls etwas, was sich ständig ändert und
praktisch nicht (exakt) vorhersagbar ist.
=====
muss ich dafür ne eine zusätzliche Bibliothek einbinden oder wie
verwende ich diesen Befehl ?
Ohh das tut mir Leid, bin neu hier ! Daran hatte ich gar nicht gedacht
Also das Ganze ist für einen ATMega-16 bestimmt und ich Programmiere mit
Programmers Notepad, dann lade ich die *.hex Files mit PonyProg in
meinen Controller
Naja, das Problem ist, dass Du auf einen AVR keine Systemuhr hast.
Desshalb hast Du auch kein time().
Mach doch ein paar Analog-Digital-Wandlungen eines nicht angeschlossenen
Pins und verwende jeweils das unterste Bit. Diese einzelnen Bits
schiebst Du zu einem 32-Bit-Wert zusammen den Du als Seed für den
Zufallsgenerator verwendest.
Aber je nach Anwendung, reicht auch ein fester Seed. Für was brauchst Du
die Zufallszahlen auf dem Controller?
Ich wollte mit meinem 2x27 Zeilen Display eine Art Bildschirmschoner
basteln,
wo das Programm zufällig an eine x-beliebige Stelle auf dem Display
springt und dann dort entweder eine 1 oder eine 0 ausgibt, also
zufällige position und zufällig 0 oder 1 !!!
das mit dem AD-Wandlungen verstehe ich nicht, da ich noch recht neu in
der Welt der uC's bin-....
Was du wissen must:
Ein Zufallszahlengenerator ist in einem Computer
normalerweise einfach eine Formel.
Irgendwas in der Form
Xneu = f( Xalt )
Es wird also eine Zahl hergenommen, diese Zahl
durch eine Formel geschickt. Das Ergebnis ist wieder
eine Zahl, die zum einen deine Zufallszahl darstellt
und zum anderen als Zahl für den nächsten Durchgang
mit der Formel herhält.
Die Frage ist nur: Wo kriegt man die erste Zahl her.
Wenn ich die kenne, und die Formel kenne, kann ich
die ganze Folge der generierten Zahlen vorhersagen.
Für echte Zufallszahlen die zb. in einem Spielautomaten
gebraucht werden, ist das natürlich nicht akzeptabel. Auch
bei Simulationen, die auf Zufallszahlen basieren, braucht
man einen guten Generator. In deiner konkreten Anwendung
spielt es aber nun wirklich keine Rolle, ob das Muster
jedes mal anders ist oder ob sich das Muster widerholt.
Eine Möglichkeit gäbe es allerdings. Lass den Startwert
so wie er ist. Du hast doch sicher irgendeinen Timer
im Program, der einen Interrupt auslöst. Bei jedem
Interrupt Aufruf rufst du einmal rand() auf. Da nicht
vorhersagbar ist, wann dein Bildschirmschoner sich einklinkt
ist auch nicht vorhersagbar, wieviele rand() Aufrufe bis zum
Start des Bildschirmschoners gemacht werden und damit ist auch
nicht vorherbestimmt, wo genau das Programm sich in die
Kette der Zufallszahlen einklinkt.
Und nochwas: Wenn schon dann seed nur einmal in einem
Programmlauf aufrufen. Das ist wichtig. Die 'Zufäülligkeit'
entsteht nur dann, wenn du die Formel arbeiten lässt. Wenn
du dich mittels seed() da immer wieder einmischt, sind deine
generierten Zahlen alles mögliche, nur keine Zufallszahlen.
PS: Die Dinger heissen nicht deswegen Zufallszahlen, weil
sie zufällig sind, sondern weil sie die statistischen
Eigenschaften von Zufall (mehr oder weniger) haben.
> Die Dinger heissen nicht deswegen Zufallszahlen, weil> sie zufällig sind, sondern weil sie die statistischen> Eigenschaften von Zufall (mehr oder weniger) haben.
Na, das ist aber nicht (ganz) richtig.
Es gibt zwei "Sorten":
a.) Pseudo-Zufallszahlen
b.) "echte" Zufallszahlen
Pseudo-Zufallszahlen werden durch Pseudo-Zufallsgeneratoren erzeugt,
auch PRNG (Pseudo Random Number Generator) genannt.
Die "echten" Zufallszahlen sind eben "echter" Zufall. Z.b. das kosmische
Rauschen oder das Elektronenrauschen an einem Halbleiterübergang etc.
Und nun der springende Punkt:
Statische gesehen sind Pseudo-Zufallszahlen vollkommen identisch wie
echte Zufallszahlen!
Du kannst statistisch keinen Unterschied zwischen Pseudo-Zufallszahlen
und echten, natürlichen Zufallszahlen feststellen.
Du kannst statistisch nur festestellen, wie hoch die Wahrscheinlichkeit
ist, ob eine Zahlenfolge nun zufällig ist oder nicht.
Wenn Du bei Pseudo-Zufallszahlen mit statistischen Methoden feststellst,
dass es höchstwahrscheinlich keine Zufallszahlen sind, ist der
Algorithmus zum Erzeugen der Pseudo-Zufallszahlen untauglich.
Wenn Du bei "echten" Zufallszahlen statistisch feststellst, dass die
Wahrscheinlichkeit für einen Zufall gering ist, hast Du meistes bei der
Messung des Zufallsprozesses (z.B. Halbleiter-Rauschen) einen Messfehler
gemacht.
Der einzige, aber sehr wichtige, Unterschied zwischen
Pseudo-Zufallszahlen und "echten" Zufallszahlen ist der, dass Du die
Folge der Pseudo-Zufallszahlen jederzeit aus dem Startwert des PRNGs
wieder herstellen kannst.
Du brauchst in nur sehr wenigen Fällen echte Zufallszahlen. Z.B. in der
Cryptographie sind echte Zufallszahlen Grundvoraussetzung.
Für Simulationen, Analysen, Bildschirmschoner, Computerspiele usw.
reichen Pseudo-Zufallszahlen vollkommen aus.
Beitrag "Zufallsgenerator"
da gabs das Thema Pseudozufallszahlen schon mal.
Ein wichtiger Unterschied ist, dass sich die Pseudozufälle nach einiger
Zeit wiederholen. Ein Autokorellation würde das beweiisen.
> Ein wichtiger Unterschied ist, dass sich die Pseudozufälle nach> einiger Zeit wiederholen.
Ja.
> Ein Autokorellation würde das beweiisen.
Da bekommst Du allerdings ein praktisches Problem. Nimm einen PRNG mit
einer Periode 2^256 (ca. 10^77) oder noch mehr, und Du bist bedient.
Kleiner Tip: Die Anzahl aller Atome im Universum wird auf 10^80 bis
10^99 geschätzt (je nach Quelle).
peinlich, Korellation wie Koralle, (und Sattelit wie Sattel) sollte
natürlich Korrelation heißen.
Früher war man eben sparsamer mit den Schieberegisterstufen, da konnte
man auch noch WLAN-Schlüssel u.ä. knacken, weil an der Stufenzahl
gespart wurde.
Spielereien mit großen Zahlen gibts öfter - mit den ersten
weißnichtwieviel (40?) Stellen von PI kann man den Durchmesser des
Weltalls auf ein Atom genau angeben. Das 1/f-Rauschen nimmt zu tiefen
Frequenzen hin zu, bei 1/(Alter des Weltalls) hat es sich verdreifacht,
(oder nur verdoppelt ?) hat Maxim mal vorgerechnet.
Sorry ich bin ein Skeptiker und Hinterfrager:
Wer weiss denn so genau wie gross das Weltall wirklich ist?
Und wer weiss mit Sicherheit, wie alt das Weltall ist?
Es sind doch alles nur Theorien und es gibt auch viele Gegentheorien.
Im Leben ist halt alles im Fluss und man weiss nicht was morgen ist. Um
wieder zurück aufs Thema zu kommen:
Man entwirft halt einen Verschlüsselungsalgo so, dass er heute nicht
ohne Weiteres geknackt werden kann. Dann baut man noch eine Reserve ein
und hofft so, dass er auch in ein paar Jahren noch genügend Sicherheit
bietet. Aber wie es im Leben so ist: Es kommt meistens anders als man
denkt....
Darum sollte man meiner Meinung nach darauf achten, dass man das Produkt
gut warten kann und allenfalls die Verschlüsselung später noch auf den
aktuellen Stand der Technik upgraden kann oder das ganze Gerät gut gegen
ein aktuelles tauschen kann.
Gut ist bereits, wenn man einen Plan hat, welche Geräte von Zeit zu Zeit
überprüft werden sollten, ob die Verschlüsselung noch stand hält oder ob
Massnahmen zu ergreifen sind.
Am schlimmsten sind Geräte wie z.B. eine Firewall oder eine online
banking software, welche bestens funktionieren, aber die einfach
vergessen werden und vor sich hin werkeln bis ein bösartiger Angriff
erfolgt....