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
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.
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"
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.
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.
genau. deswegen vorher srand() aufrufen, wobei man spaetesten dort wieder einen Zufallswert braucht. Ein Oszillator am ADC waere ggf. auch dafuer geeignet.
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.
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 ;-)
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.
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.
Angeblich soll das ja ganz gut funktionieren: http://www.rn-wissen.de/index.php/Zufallszahlen_mit_avr-gcc#Startwert_.28seed.29_besorgen Aber du hast schon Recht, für Verschlüsselungen wär das bestimmt nichts ;-)
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...
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.
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.
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
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.
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?
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.
>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.
Wenn man der Verteilung nicht traut, kann man damit als seed zumindest eine neue Reihe starten.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.