www.mikrocontroller.net

Forum: Compiler & IDEs wie erzeugt man eine zufallszahl


Autor: slaud (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kann mir jemand weiterhelfen

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eine Zufallszahl kann man nur mit Hardware-Unterstzützung bekommen. Wenn
Pseudozufallszahlen auch reichen (also welche, die über einen
Algorithmus vom Computer berechnet werden und nur so aussehen, als
seien sie zufällig), dann such mal nach "pseudo random number
gnerator" oder PRNG.
Oder willst du nur wissen, wie die Standard-C-Funktion dafür heißt? Das
wären dann srand() und rand().

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Methode der lineare Kongruenz bietet folgende rekursive Formel:

x(n+1)=(ax(n)+x)mod m

Wählt man geeignete Werte für a und c ist der Anfangswert von x egal
und man erhält eine gleich verteilte Folge von Zufallszahlen mit der
Periodizität m. Sollen bei jedem Neustart des Zufallszahlengenerators
verschiedene Werte erscheinen müssen die Anfangswerte entsprechend
variiert werden.

Für m=32 sind a=1664525 und c=32767 günstige Anfangswerte.

Das Ganze stammt von Analog Devices. Ich habe es auf einem DSP in
Gebrauch.

Autor: Patrick Dohmen (oldbug) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Malte __ (malte) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ansonsten ist der genaue Zeitpunkt einer Benutzereigabe meist recht
zufällig. Also seit dem Programmstart einen Timer durchzählen lassen
und auslesen sobald der Benutzer eine Taste drückt.
Dies verwende ich in einem Programm von mir dann als
Initalisierungswert für die oben genannten avr-libc Funktionen.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du verstärkst das Rauschen eines Verstärkers und samplest dann das
Signal.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
s/Verstärker/Z-Diode/

Ich wollte immer mal ausprobieren, ob das Rauschen einer
Z-Diode schon dick genug ist, um den normalen Analogkomparator
umschalten zu lassen.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Äh, was ich meinte, ist natürlich: du verstärkst das Rauschen eines
Halbleiterbauelements mit einem Verstärker :)

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Variante, einfach eine Z-Diode an den Analogkomparator zu
klemmen, tut nicht, die Offsetspannung ist offenbar höher als
das Rauschen einer Z-Diode.

Was aber funktioniert ist, den ADC mit seinen 200-fachen
Differenzeingängen zu benutzen.  Setup: Z-Diode 3,3 V mit
1,8 kOhm gegen + 5V und an einen der beiden Diff-Eingänge, von
da 22 kOhm gegen den anderen Eingang, den mit 22 µF abgeblockt.
Hier ein Histogramm der Messergebnisse:

 -7:   4
 -6:   7
 -5:  11
 -4:  25
 -3:  34
 -2:  67
 -1:  85
  0: 136
  1: 171
  2: 224
  3: 221
  4: 206
  5: 208
  6: 255
  7: 216
  8: 185
  9: 166
 10: 130
 11: 111
 12:  53
 13:  37
 14:  23
 15:   6
 16:   2
 17:   2

Die unteren Bits des ADC-Wertes sollten ein recht gutes seed für
den PRNG ergeben.

Autor: Andreas Siebel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn das nicht mal nicht die 50 Hz von der Netzleitung sind ;)

Sieht mir nach nem schönen Ausschnitt von nem Sinus aus.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Häh?

Du hast das Prinzip meines Histogramms nicht verstanden. ;-)

Es handelt sich um die Messwerte auf der linke Seite, gegenüber-
gestellt mit deren Häufigkeit im gesamten Messzeitraum auf der
rechten Seite.  (Ich hätte es natürlich noch auf prozentuale
Häufigkeiten umrechnen können, habe ich nicht dran gedacht.)

Nein, kein Sinus, wohl eher eine Gauß'sche Glockenkurve, genau das
muss aber rauskommen.

Klar hängt da sicher auch eine Brummeinstreuung mit drin (ich kann
das eventuell nochmal in einer Blechdose wiederholen, die
Laborstromversorgung ist eher unverdächtig), aber letztlich kann
dir das in der Praxis sch***egal sein, ob das nun Rauschen, Brummen,
Knistern oder Knattern ist: das wesentliche Ziel ist es ja, dass
jemand von außen selbst bei exakter Kenntnis der benutzten Hard-
und Software nicht erraten kann, mit welchem genauen Startwert man
als seed in den PRNG hineingegangen ist, d.h. er kann die benutzte
Zufallszahlenfolge nicht voraussagen.

Das Experiment sollte nur demonstrieren, dass es mit einem geringen
Aufwand an externer Elektronik möglich ist, wenigstens einigermaßen
,,Zufall'' zu produzieren.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Es handelt sich um die Messwerte auf der linke Seite, gegenüber-
> gestellt mit deren Häufigkeit im gesamten Messzeitraum auf der
> rechten Seite.

p.s.: auf der linken Seite stehen alle Messwerte, die im
Beobachtungszeitraum (der ca. 1 Minute oder so umfasste) beobachtet
worden sind, d.h. der ADC hat weder weniger als -7 noch mehr als +17
gemessen.  Die Mitte der Gaußkurve liegt nicht bei 0, einerseits haben
die Eingangsströme an der Widerstandskette bereits zu extern messbaren
Spannungsdifferenzen geführt, andererseits hat natürlich auch der
Differenzverstärker des ADC eine Offsetspannung.

Das alles ist aber für das Zufallsexperiment gar nicht wichtig, im
Gegenteil: die eher breite ,Spitze' der Glocke bedeutet, dass man
selbst mit wenigen aufeinanderfolgenden Messungen bereits so viel
,Zufall' einsammeln kann, dass das für das Ziel des Experiments sehr
gut ausreichend sein kann.  Es genügt eigentlich, nur jeweils das
unterste Bit einer jeden ADC-Messung auszuwerten und dann 31 Messungen
vorzunehmen, um die 31 bits für das srandom()-seed zu gewinnen.

Autor: Andreas Siebel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Histogramm ja.. hätte ich mal lesen sollen :)


Sieht wirklich nach ner schicken Normalverteilung aus.

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die mathematischen Methoden produzieren allerdings besseres Rauschen.
Sie erzeugen (periodisch) Zufallswerte, welche über den gesamten
Wertebereich gleichverteilt sind. Eine Gaußkurve kann nicht i.O. sein,
wenn weißes Rauschen das Ziel ist.

"Es genügt eigentlich, nur jeweils das unterste Bit einer jeden
ADC-Messung auszuwerten und dann 31 Messungen vorzunehmen, um die 31
bits für das srandom()-seed zu gewinnen."

So wird es etwas, wobei noch der Performance-Vergleich ausstünde :-)

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Die mathematischen Methoden produzieren allerdings besseres
> Rauschen.  Sie erzeugen (periodisch) Zufallswerte, welche über den
> gesamten Wertebereich gleichverteilt sind.

Ein weißes Rauschen ist nebensächlich.  Wenn es dir um irgendwelche
kryptografischen Dinge geht, ist vordergründig wirklich nur wichtig,
dass dir (selbst bei Kenntnis der Interna) keiner voraussagen kann,
welche Zufallszahl du jetzt wählst.  Das ist bei einem PRNG als
solches erstmal nicht gegeben, dazu muss man ihn ordentlich mit einem
seed füttern.  Ob die resultierende Zufallszahlenfolge wirklich
gleichverteilt ist, interessiert kein Schwein, lediglich zu große
Häufungen muss man vermeiden -- sonst könnte sich ein Angreifer mit
seinen Rateversuchen ja auf diese Häufungen konzentrieren.

> So wird es etwas, wobei noch der Performance-Vergleich ausstünde :-)

Ist für das Thema komplett egal.  Wenn es sicher sein soll, spielt
Zeit im Allgemeinen keine Rolle.

Autor: Sssssss (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wegen Seed per ADC:
Das funktioniert aber nur wenn der Angreifer nicht ans System
drankann.
Sonst klemmt er den ADC auf GND und hat immer dieselbe seed ...

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Irgendwie hat sich der Server verschluckt, ich sehe den Ursprungsbeitrag
nicht mehr. Von daher kann ich das eigentliche Thema (Zielapplikation)
schwerlich rekonstruieren.
(17.08.2005 01:34   -->  "kann mir jemand weiterhelfen" ist alles
sichbare)

Da ich Zufallszahlen bei Verwendung stets in großer Zahl benötige
(Regelungstechnik) ist meine Sichtweise halt eine andere.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Sonst klemmt er den ADC auf GND und hat immer dieselbe seed ...

Vielleicht nichtmal. ;-)  Aber den Fall sollte man erkennen können
und kann dann den Dienst ganz quittieren.

> Da ich Zufallszahlen bei Verwendung stets in großer Zahl benötige
> (Regelungstechnik) ist meine Sichtweise halt eine andere.

Spricht ja nichts gegen die Benutzung eines PRNG, aber man sollte
ihm eben trotzdem ein passendes seed mitgeben -- sonst ist die
Zahlenfolge eben alles andere als zufällig.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.