C++Guns – RoboBlog

21.08.2007

Zufallsgenerator

Filed under: AVR — Thomas @ 17:08

Als ich mir eine Video-Vorlesung der Uni Tuebingen ansah, kam mir die Idee, mit einem AVR einem Zufallsgenerator zu programmieren. Als Quelle sollte der Analog-Digital Wandler (ADC)dienen, dessen Eingang in der Luft hängt. Es wird also nur das Rauschen des Wandlers und ein paar Störsignale digitialisiert. Von dem eingelesen Wert wir nur das erste Bit benutzt, also ob die Zahl grade oder ungerade ist. Nach acht Durchläufen hat man somit eine Zufallszahl mit einem Wertebereich von 0 bis 255.
Beim echten Zufall sollte sich eine Gleichverteilung einstellen. Da es 256 Mögliche Ereigniszahlen gibt, beträgt die Wahrscheinlichkeit fü eine Zahl 1/256 = 0.39%.
zufallsgleichverteilung1
Nach dem ersten Testlauf mit 39 Millionen Zufallszahlen, sah die Verteilung doch garnicht mal so schlecht aus. Aber es gibt einige Zahlen, die stark von der erwarteten WK abweichen. Darunter ist z.B. die 2 mit 0.71%, die 32 mit 0.63%, die 128 mit 0.98% und die 192 mit 0.87%. Unter binärer Betrachtungsweise fällt sofort auf, dass die Null besonderst oft vertreten ist.
2 = 00000010
32 = 00100000
128 = 10000000
192 = 11000000
Nun liegt die Vermutung nahe, dass der ADC mehr geraden Zahlen produziert als ungeraden. Ein einfacher Test bestätigt es, die Null kommt mit 0.2% häufiger vor als die Eins. Die Ursache hierfür kann nur auf Bauteiltolleranzen im ADC zurückzuführen sein. Als eine Referenzspannung vom 5V genommen wurde, anstatt 2.65V, trat die Eins nun mit 0.2% häufiger auf. Da der Mikrocontroller 6 ADC Kanäle hat, liegt die Vermutung nun nahe, durch wechseln des ADC Kanals den Fehler zu minimieren.

Gesagt, getan. Hier ist die neue Verteilung.
zufalls

Ahja, das ganze läuft auf einem ATmega8. Das Programm kann aber auf jeden beliebigen Mikrocontroller portiert werden, solange es mindestens einen ADC gibt.
Die Zufallszahlen werden über USART gesendet. Ansonsten gibt es nichts zu sagen, ausser: Macht was ihr wollt damit :)
zufallsgenerator-01.zip

No Comments

No comments yet.

RSS feed for comments on this post.

Sorry, the comment form is closed at this time.

Powered by WordPress