Pfad:
Home =>
AVR-DE =>
Anwendungen =>
Zufall ATtiny13 => 16-Bit-Zufall
This page in english:
 |
AVR-Anwendungen
16-Bit-Zufallszahlen mit ATtiny13
Anwendung und Software für Zufallszahlen in Assembler |
16-Bit-Zufallszahlen mit ATtiny13
Ganz genauso wie 8-Bit-Zufallszahlen kann man auch 16-Bit-Zufallszahlen machen.
Ich mache meine ganz einfach mit dem folgenden Algorithmus:
.equ cSeed = 12345
.equ cRnd = 0b1011101110101010
.equ cCnt = 1000000
;
; Startbelegung
ldi ZH,High(cSeed)
ldi ZL,Low(cSeed)
; Set randomizer
ldi YH,High(cRnd)
ldi YL,Low(cRnd)
; Prepare a random
eor ZH,YL
eor ZL,YH
add ZL,YL
adc ZH,YH
adiw YL,1
Loop:
rjmp Loop
Wir beginnen also mit zwei 16-Bit-Zahlen: cSeed und cRnd. Und die
beiden werden mit zwei EXOR und einem ADIW-Befehl etwas durcheinander gewirbelt.
Man beachte, dass beim EXOR das MSB mit dem LSB vertauscht ist. Das hat sich als
wesentlich besserer Zufallsgenerator herausgestellt.
Für die so produzierten Zufallszahlen habe ich den AVR-Simulator
avr_sim in der Version 2.5 ein
wenig erweitert, um mir das Gewese mit der RS232-Schnittstelle wie
hier sparen zu können: der
Simulator produziert die Zufallsszahlen und schreibt sie wahlweise im
Dezimal- oder im Hexadezimalformat in eine .CSV-Datei. Ein
ATtiny13-Zufallsgenerator ohne ATtiny13, nur auf dem Laptop.
Mit diesem Equipment habe ich 500.000 Zufallszahlen produziert und in eine
Datei geschrieben. Wer so was mal braucht: hier
ist sie mit 3,9 MB voll mit Hexadezimalzahlen.
Analyse von 16-Bit-Zufallszahlen
Wenn man solche Dateimonster mit einem LibreOffice-Calc öffnet (was dank des
perfekten Programms durchaus rasch geht) wird nicht so arg glücklich: das
Calc ist mit dem Hantieren mit 1.000.000 Hex-Zahlen schnell überfordert.
Das Umwandeln in Dezimal geht noch einigermaßen fix, aber um Dupletten zu
suchen und zu finden, ist das LibreOffice dann doch etwas zu behäbig - und
stürzt dann auch gerne mal ab.
Wie immer, wenn mich Software mit Abstürzen ärgert: ich habe mein
eigenes Zahlen-Analyse-Programm geschrieben. Das füttere ich mit einer
.csv-Datei, das mir das avr_sim so einliefert. Das Programm macht dann Folgendes:
- Es liest die erste Zeile und überprüft, ob diese Zeile mit dem
Wort "Comment:" beginnt. Ist das der Fall, liest es den Kommentar
ein.
- In der nächsten Zeile liest das Programm die Kopfzeilen der Spalten
ein und ermittelt anhand der gefundenen Tab-Zeichen, wieviele Spalten die
.csv-Datei hat. Die Spaltenüberschriften werden in das Ausklappfeld
"Read from column" abgelegt. Es wählt die letzte der
gefundenen Spalten aus, mit dem Ausklappfeld können auch weitere
Spalten der Datei ausgewertet werden.
.
- Für die ausgewählte Spalte wird festgestellt, ob es sich um
dezimale oder hexadezimale Zahlen handelt. Hexadezimale Zahlen sind in
"" eingeschlossen, damit sie beim Lesen mit LibreOffice als Text
importiert werden. Das Ergebnis der Prüfung kann man dem Auswahlfeld
"Decimal" ansehen. Man kann es auch manuell verstellen, nur
werden die Zahlen bei einer falschen Einstellung nicht mehr erkannt.
- Nun liest Random16 alle Zahlen ein und gibt ihre Anzahl im Editierfeld
"Vlaues" an. Es ermittelt für alle möglichen Zahlen
zwischen 0 bis 65.535, wie häufig sie in den eingelesenen Zahlenwerten
vorkommen. Die maximale Anzahl an Vorkommen wird im Editierfeld
"Max" ausgegeben.
- Die Anzahl an Vorkommen der 65.536 Zahlen wird in dem Bild links
dargestellt. Die Horizontalachse stellt die LSBs der 65.536 Zahlen dar, die
vertikale die MSBs. Die dabei verwendeten Pixelfarben sind in der Farbskala
rechts neben dem Bild zu sehen. Die am h&aul;ufigsten vorkommenden Zahlen
kommen 22 mal vor, die am wenigsten häfig vorkommenden 38 mal. Das
Vorkommen im Mittelfeld variiert, im Mittel kommen alle Zahlen natürlich
7,63 mal vor (500.000 / 65536 = 7,63). Die Farbverteilung im Bild sieht schon
mal recht zufällig aus.
- Das Bild kann mit dem Knopf "Save as .PNG file" als Grafikdatei
auf die Platte gespeichert werden.
- Im Bereich "Find a repetition" können Zahlenquadrupletten
gesucht werden:
- Im Ausklappfeld "Select highest" können die zehn
häufigsten Vorkommen zur Analyse gewählt werden. Diese werden
mit ihrem ersten Vorkommen in der Zahlenreihe in das Editierfeld
"Search for" kopiert und gesucht.
- Im Editierfeld "Search for" können Zahlen auch manuell
und unabhängig von der Häufigkeit ihres Vorkommens eingegeben
werden. Hexadezimalzahlen müssen dabei in "" einschlossen
werden.
- Wenn man den Knopf "Start" drückt, dann werden alle
Zahlen von 0 bis 65.535 einmal durchgeixt. Für die jeweilige Zahl
werden alle Vorkommen gesucht und die Quadrupletten mit allen vorherigen
Fundstellen verglichen. Falls eine gleiche Quadruplette gefunden wird,
hält der Suchprozess an. Handelt es sich um sehr lange Zahlenreihen,
kann man den langsam ablaufenden Prüfprozess an der Fortschrittsanzeige
verfolgen.
- Wenn man den Knopf "Save ColCnt" betätigt, kriegt man die
Farbenskala und die Häufigkeiten der Vorkommensanzahlen in eine
.csv-Datei geschrieben und kann daran sehen, wie schön der Zufall
sich dem Euler-Prinzip annähert.
Lazarus-Quellcode von Random16
Die Software ist in Lazarus geschrieben und kann mit dem Quellcode
hier kompiliert werden.
Assembler Quellcode zur Erzeugung von 1 Million Zufallszahlen
Dieser asm-Quellcode produziert
1 Million Zahlen. Das Speichern der erzeugten Zahlen als .csv-Datei
funktioniert nur mit avr_sim ab Version 2.5.
Lob, Tadel, Fehlermeldungen, Genöle und Geschimpfe oder Spam bitte über
das Kommentarformular an mich.
©2021 by http://www.avr-asm-tutorial.net