Zufallsgenerator für µc
-
Hallo, ich spiel gerade ein bischen mit einem µc (atmel avr) herum und versuche gerade einen halbwegs vernünftigen Zufallsgenerator zu erstellen.
#include "random.h" #include <stdint.h> --> uint8_t ist unsigned char (eben 8bit) /* Letzter Pseudo-Zufallswert */ static uint8_t sRandLast; /* Initalisiert den Zufallsgenerator */ inline void srand8(uint8_t seed) { sRandLast = seed; } /* Erzeugt eine 8-bit Zufallszahl */ inline uint8_t rand8(void) { /* Muliplizieren mit 11010001b Addieren von 10010101b */ return sRandLast = (sRandLast * 209 + 149); } /* Erzeugung einer 8-bit Zahl in einem Bereich */ inline uint8_t randrange8(uint8_t min, uint8_t max) { return (rand8() % (max - min + 1)) + min; }
Nun hab ich einige Fragen zum Generator:
- Welche Zahlen soll ich nehmen zum multiplizieren und addieren? Ich hab die aktuellen so ziemlich willkürlich festgelegt (eben relativ hoch). 'Optisch' (hab LEDs drab zum testen) sind alle Bits 'zufällig' nur Bit0 wechselt einfach nur. Wie kann man das ändern?
- Nun wohl das wichtigste: Woher bekomm ich auf dem µc einen anständigen Seed? Jemand eine Idee?
Und noch an bzgl. C weil ich sonst C++ verwende:
- Kann C kein Überladen von Funktionen oder liegt das an meinem Compiler für den µc?
- Soll ich solche kleinen Funktionen lieber als Makro schreiben? Sollte ja eigentlich keinen unterschied machen wenn der Compiler das 'inline' unsetzt. Ich werd das mal schnell im Asm-File nachschauen.Gruß
-
FireFlow schrieb:
- Welche Zahlen soll ich nehmen zum multiplizieren und addieren? Ich hab die aktuellen so ziemlich willkürlich festgelegt (eben relativ hoch). 'Optisch' (hab LEDs drab zum testen) sind alle Bits 'zufällig' nur Bit0 wechselt einfach nur. Wie kann man das ändern?
Da gibt es wohl mehr als genug Verfahren in der Literatur und im Netz (btw, was spricht eigentlich gegen die Verwendung von man: rand)?
(auf die Schnelle habe ich den Satz von Knuth gefunden, mit dem du die Güte deines Verfahrens beurteilen kannst)
- Nun wohl das wichtigste: Woher bekomm ich auf dem µc einen anständigen Seed? Jemand eine Idee?
Eine interne Uhr hat der nicht, oder?
- Kann C kein Überladen von Funktionen oder liegt das an meinem Compiler für den µc?
Nein, das gehörte zu den Neuerungen von C++.
-
CStoll (off) schrieb:
(btw, was spricht eigentlich gegen die Verwendung von man: rand)
Dass ich kein rand() zur Verfügung hab in meiner Lib für den µc. Eine Uhr hab ich auch nicht. Ich vermute ich werde den Seed einmal auf 0 setzen und dann immer am Ende ins EEPROM speichern und beim nächsten Start wieder von dort auslesen. Ist nur irgendwie blöd dass Ende der Moment ist zu dem der Benutzer den Strom abdreht.
@Es gibt schon genug Implementierungen: Die werden sich wohl wenig von meiner unterscheiden. Ich möchte eben mal generell wissen wie man auf die guten 'MagicNumbers' kommt. Das mit dem Satz von Knuth werd ich mal machen.
Gruß
-
Evtl. das Rauschen am A/D als seed mißbrauchen?
-
TactX schrieb:
Evtl. das Rauschen am A/D als seed mißbrauchen?
Wie liest man das aus?
-
TactX schrieb:
Evtl. das Rauschen am A/D als seed mißbrauchen?
Leider auch nicht. Wenn ich den A/D aktivieren kann ich die Pins nicht mehr für IO verwenden, und wir brauchen sie
gute_frage schrieb:
TactX schrieb:
Evtl. das Rauschen am A/D als seed mißbrauchen?
Wie liest man das aus?
<offtopic>
Ist natürlich abhängig von deinem µc. Normalerweise aktivierst du den A/D Konverter in einem Kontrollregister und legst auch die Einstellungen dort fest (siehe Dokumentation). Dann einfach die Pins des A/D auslesen. Bei den meisten µcs kann man diese eben auch als IO nutzen.
</offtopic>@Satz von Knuth:
Hab bemerkt, dass mein mod-Wert, der impliziert durch den Datentyp 256 ist, ziemlich ungünstig ist. Soll ich besser eine 16bit Variable nehmen und dann davon auch noch die höheren Bits (die pseude-zufälliger sein sollen) nehmen?Gruß