www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Zufallszahl..


Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

ich programmiere gerade an einem Gerät womit man durch Zufall div. 
Lieder abspielen kann.
-- wie kann ich eine echte Zufallszahl generieren.

Ich hätte mir gedacht einen Rauschgenerator per Analog aufzubauen und 
mit dem ADC den momentanen Wert einzulesen.

Hardware: Mega128


Danke für Ideen

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du ein schönes Rauschen hinbekommst, geht das sicher.

Eine andere Idee wäre, einen Sägezahn zu erzeugen mit einer
nicht allzu stabilen Frequenz und bei Bedarf den aktuellen
Wert zu holen.

Das hätte den Vorteil, daß die gelesenen Werte ziemlich
gleiche Wahrscheinlichkeit haben.

Autor: Axel Krüger (axel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Benutzt du c ??  Da gibt es doch die rand() Funktion.  Zuvor must du 
m.E. srand() mit einem integer Argument aufrufen. google mal danach 
muesste fuer µc auch gehen.

Beitrag "Zufallszahl [0;6], ATtiny 2313"

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Martin schrieb:
> durch Zufall div. Lieder abspielen kann.
Wenn du nicht unbedingt eine wirklich gute Zufallszahl brauchst, dann 
ist das mit dem externen Rauschgenerator denkbar.

Aber wenn du sowieso einen Prozessor hast (und nicht C programmierst), 
dann bietet sich ein (möglichst breites) LFSR (Linear Feedback Shift 
Register) an. Das kann recht einfach in Assembler abgebildet werden.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Axel Krüger schrieb:
> rand()

Da muß man sich aber auch ernsthaft überlegen, wo man den
Startwert herbekommt, wenn man nicht nach jedem Einschalten
dieselbe Zahlenfolge haben will.
So richtig zufällig sind die Werte nämlich nicht.

Autor: Axel Krüger (axel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
genau. deswegen vorher srand() aufrufen, wobei man spaetesten dort 
wieder einen Zufallswert braucht. Ein Oszillator am ADC waere ggf. auch 
dafuer geeignet.

Autor: Detlev T. (detlevt)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus Wachtler schrieb:
> Da muß man sich aber auch ernsthaft überlegen, wo man den
> Startwert herbekommt

Ein berechneter "Zufallswert" hat den großen Vorteil, dass man die 
Verteilung kennt/berechnen kann.

Auf dem PC nutzt man als seed ja häufig den Timer. Das könnte man auch 
hier tun. Es stellt sich ja die Frage, was "Einschalten" genau bedeutet. 
Ist dann der Strom weg oder schickt man den µC nur schlafen, wobei ein 
Zähler weiterlaufen könnte? Man könnte auch einen externen gepufferten 
RTC-Baustein nehmen. Das sollte für die meisten Zwecke reichen.

Alternativ könnte man einen Wert auch mit dem ADC erzeugen, indem man 
von mehreren Messungen eines Pins, der "in der Luft hängt" immer nur das 
niederwertigste Bit nimmt. Den verwendet man dann als seed. Als 
Zufallswert selbst ist so eine Zahl wohl eher ungeeignet, weil es sicher 
starke Korrelationen gibt.

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Detlev T. schrieb:
> Klaus Wachtler schrieb:
>> Da muß man sich aber auch ernsthaft überlegen, wo man den
>> Startwert herbekommt

Für AVR geht das prima mit nicht-initialisiertem RAM-Inhalt.

Beitrag "Miniprojekt: Lagerfeuer-LED (ATtiny25)"

Für solch Anwendungen wie Lagerfeuer, zufällig Liedchen düdeln ist das 
allemal ausreichend. Wir machen hier ja keine Kryptographie ;-)

Autor: Hornmüller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Martin schrieb:
> ich programmiere gerade an einem Gerät womit man durch Zufall div.
> Lieder abspielen kann.
> -- wie kann ich eine echte Zufallszahl generieren.

Für solch eine einfache Anwendung wäre eine echte Zufallszahl massiver 
Overkill. Da reicht die Zufallszahlenfunktion des C-Compilers locker 
aus.

Autor: Detlev T. (detlevt)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Johann L. schrieb:
> Für AVR geht das prima mit nicht-initialisiertem RAM-Inhalt.

Naja. Der Inhalt hängt von den Fertigungs- und Temperaturschwankungen 
der konkreten Hardware ab. Der ist damit zwar undefiniert, aber alles 
andere als "zufällig". Ich würde da befürchten, das dieser Inhalt auf 
demselben Chip beim Start auch immer dieselben Werte haben könnte.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Angeblich soll das ja ganz gut funktionieren:
http://www.rn-wissen.de/index.php/Zufallszahlen_mi...

Aber du hast schon Recht, für Verschlüsselungen wär das bestimmt nichts 
;-)

Autor: Lehrmann Michael (ubimbo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Detlev T. schrieb:
> Auf dem PC nutzt man als seed ja häufig den Timer.
Ein ganz einfacher Initialwert für srand() ist ein Zählerwert und ein 
Tastendruck eines Benutzers...

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Detlev T. schrieb:
> Johann L. schrieb:
>> Für AVR geht das prima mit nicht-initialisiertem RAM-Inhalt.
>
> Naja. Der Inhalt hängt von den Fertigungs- und Temperaturschwankungen
> der konkreten Hardware ab. Der ist damit zwar undefiniert, aber alles
> andere als "zufällig". Ich würde da befürchten, das dieser Inhalt auf
> demselben Chip beim Start auch immer dieselben Werte haben könnte.

Für AVR und den genannten Anwendungsfall reicht das locker -- hab ich 
schon mehrfach verwendet. Auch ein und das selbe AVR-Exemplar hat nach 
dem Einschalten nicht-nachvollziehbare Inhalte (RAM+GPRs). Wenn die 
Spannung nur sehr kurz wegfällt, nimmt die Streuung der Werte ab, aber 
da der gesamte RAM verwendet wird, ist selbst das kein Problem. Der Wert 
wird natürlich nur zur Init-Zeit einmal bestimmt und dient als Startwert 
für nen Pseudozufalls-Generator. Die Beispiel-Anwendung ober nimmt ein 
XOR über alle Zellen, was freilich keine sonderlich ausgefeilte 
Hash-Funktion darstellt. Aber das ist ein reines Software-Thema.

So spart man jedenfalls einiges an Hardware, und es ist fix angetestet, 
ob das für die konkrete Anwendung gut genug ist oder nicht.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lothar Miller schrieb:
> Detlev T. schrieb:
>> Auf dem PC nutzt man als seed ja häufig den Timer.
> Ein ganz einfacher Initialwert für srand() ist ein Zählerwert und ein
> Tastendruck eines Benutzers...

Genau. Wenn z.B. die Funktion über einen "shuffle"-Taster aktiviert 
wird, kann man einfach den Timer in dem Moment auslesen, indem der 
Taster gedrückt wurde und das als Seed für rand() verwenden.

Autor: Rolf Pfister (rolfp)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falls du trotzdem noch einen Hardware-Rauschgenerator basteln willst. 
Ich habe auch schon mal sowas gemacht:
http://www.rolfp.ch/elektronik/#zufallsgen
Das Rauschen wird in der etwas seltsamen Schaltung mit den beiden BC547 
erzeugt. Danach einfach so weit verstaerkt (3*BC550) dass man ein 
digitales Signal bekommt.

Rolf

Autor: Ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat dein Würfel 7 Seiten?

Autor: Rolf Pfister (rolfp)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Ich (Gast)" schrieb:
> Hat dein Würfel 7 Seiten?

Welcher Würfel, wie kommst du jetzt da drauf?

Autor: adfix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Martin schrieb:
> Ich hätte mir gedacht einen Rauschgenerator per Analog aufzubauen und
> mit dem ADC den momentanen Wert einzulesen.


Warum nur der ganze Aufwand? Ein nicht angeschlossener AD-Pin liefert 
bereits hervorragende echte Zufallswerte als AD-Wert.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Florian schrieb:
> Ein nicht angeschlossener AD-Pin liefert
> bereits hervorragende echte Zufallswerte als AD-Wert.
Bist du dir da sicher, dass diese Werte was taugen? Nimm doch mal ein 
paar (zigtausend) Werte auf und lass dir die statistische Verteilung mit 
Excel (o.ä.) anzeigen....
Du wirst sehen: Zufall sieht anders aus  :-o
Oder sind die Ansprüche an diesen "Zufall" eher gering?

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zufallszahle - kein Problem!

Man nehme die letzten beiden Ziffern der gelistetetn Rufnummern aus 
einem Telefonbuch (sagen wird dem Berliner, ab Seite 236). Das ergibt 
erstklassige Zufallszahlen.

Autor: Vuvuzelatus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Bist du dir da sicher, dass diese Werte was taugen?

Man sollte natürlich nicht die kompletten ADC-Samples verwenden, sondern 
von jedem nur das niederwertigste Bit. Setzt man je acht dieser LSBs zu 
einem Byte zusammen, was mit wenigen Zeilen Code erledigt ist, darf man 
durchaus einen akzeptabel guten Byte-Zufallswert als Ergebnis erwarten.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn man der Verteilung nicht traut, kann man damit als seed
zumindest eine neue Reihe starten.

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.