www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Zufallszahl erzeugen


Autor: Sascha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Wie erzeugt man eigentlich Zufallszahlen?

Ich möchte jetzt nicht wissen, wo es irgendwo eine Bib-Funktion gibt,
die sowas macht, sondern ich möchte so eine Funktion selber
implementieren.

Der Hintergrund: Ich bin gerade dabei mir ein Videospiel selber zu
bauen. Ich greife dabei nicht auf irgendeinen MC zurueck, sondern
verwende meinen eigenen Prozessor, der (wenn er mal fertig ist - happy
debugging) in einen CPLD gebrutzelt wird.

Desshalb muss ich mir so eine Routine selber schreiben.

Ich kann mir da überhaupt nicht vorstellen, wie man eine Zufallszahl
erzeugt. Vielleicht kann mir jemand auf die Sprünge helfen?

Autor: Jürgen Schuhmacher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Einen sehr schnellen Zähler mit einem von einem aeusseren Einfluss
abhängigen Intervall abfragen. Der Zähler muss genügend oft loopen. Bei
einem AVR würde ich das Rauschen eines offenen AD-Eingangs heranziehen.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
echte Zufallszahlen kannst du in einem Rechner nur dann
erzeugen, wenn du irgendeine Hardware hast, die sie
dir liefert, zb. wird oft das Rauschen von irgendwelchen
Dingen benutzt um daraus Zufallszahlen abzuleiten.

Hast du sowas aber nicht zur Verfügung, dann bleibt dir nur
der Weg über Pseudozufallszahlen. Das ist eine Rechenvorschrift,
die in der Lage ist eine Folge von Zahlen zu generieren, deren
statistische Eigenschaften denen von echten Zufallszahlen
möglichst nahe kommen. Gute Algorithmen sind dabei erstaunlich
schwer zu finden, sodass ich dir nur davon abraten kann selbst
einfach eine Formel zu benutzen. Weiters kommt hinzu: gute
Zufallszahlengeneratoren sind erstaunlich aufwändig, sodass
man immer die Frage des Laufzeitaufwandes berücksichtigen
muss.

Eine gerne benutzter Art von Generator sieht in C zb so aus

http://www.mikrocontroller.net/forum/read-1-401097.html#new

Autor: Michael U. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

für ein Videospiel könnte die Routine reichen, die ich für ein
Kaminfeuer im Modellpuppenhaus meiner Frau benutze...
Beruht auf rückgekoppeltem Schieberegister, liefert eine durchaus
brauchbare Folge.
Du mußt Dir allerdings einen zufälligen Startwert beschaffen, dafür
geht aber zum Beispiel ein Counter, der ab Reset zählt bis die erste
Taste gedrückt wird oder ähnliches.

Die Routine stammt irgendwo aus den Weiten des WWW, ich habe eine
ähnliche mal vor -zig Jahren auf einem Z80 benutzt.

Gruß aus Berlin
Michael

Autor: Hagen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Für ein CPLD werden die Shift Register wohl die beste Wahl sein. Suche
mal nach LFSR -> Linear Feedback Shift Register oder auch nach SR-LFSR.
Auf einem CPLD dürfte sowas sehr effizient umzusetzen sein, so lange man
das/die Polynom/e hardcoded reinbaut.

Für Spiele und auch viele andere Anwendung sind die
Pseud-Zufalls-Generatoren den echten RNGs zu bevorzugen. Diese PRNGs
sind nämlich reproduzierbar im Gegensatz zu echten RNGs, und dies ist
ein enormer Vorteil bei der Entwicklung.

Um dann zur Laufzeit immer andere Sequenzen zu erzeugen musst du nur
beim Startup das LFS-Register mit einem Wert initalisieren. Dieser Seed
könnte im EEPROM abgespeichert werden. Dazu lade ich meistens diesen
Seed beim Startup aus dem EEPROM und speichere diesen im LFSR. Dann
wird der gleiche Seed einfach verändert, zb. Seed := (Seed*Seed) +1 mod
2^31 und dieser Wert als nächster Startwert ins EEPROM gespeichert. Das
läuft alles im Startup ab.

Gruß Hagen

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.