Pfad: Home => AVR-DE => Anwendungen => Zufall ATtiny13 => 16-Bit-Zufall   This page in english: Flag EN Logo
Zufallsfarben 250*250 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.

Random16 zur Analyse von 16-Bit-Zufallszahlen 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:
  1. 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.
  2. 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.
  3. .
  4. 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.
  5. 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.
  6. 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.
  7. Das Bild kann mit dem Knopf "Save as .PNG file" als Grafikdatei auf die Platte gespeichert werden.
  8. Im Bereich "Find a repetition" können Zahlenquadrupletten gesucht werden:
  9. 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.
Verteilung der Häufigkeit des Vorkommens

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