AVR und Zufallszahlen

Gast #93304
Lesenswert?
• ▲
▼
Zufallszahlen können diskret(mit schaltkreisen) erzeugt werden,indem
man ein Schieberegister benutzt, bei dem bestimmte Bits über
Exor-verknüpfung auf den Eingang zurückgefuhrt werden.Das lässt sich
auch Softwaremäßig realisieren.
Eine andere Möglichkeit ist,ein analoges Rauschsignal zu erzeugen,und
dieses über Komperatoren in den MC einzulesen.
Gast #93306
Lesenswert?
• ▲
▼
Für das Problem gibt's auch in den C-FAQs einen portablen Standard
Random Number Generator:

// portable random number generator of Park and Miller; best C-FAQs
version
#   define PMRAND_MIN 1         // Min. output
#   define PMRAND_MAX 2147483647        // Max. output
#   define a 48271
#   define m 2147483647
#   define q (m / a)
#   define r (m % a)

static long int seed = 1;

// initialisation, e. g. PMrand_seed((long int)time(NULL))
void
PMrand_seed (long int j)
{
  seed = j;
  return;
}

// seed==0-tolerant version
signed long int
PMrand ()
{
  signed long int hi = seed / q;
  signed long int lo = seed % q;
  signed long int test = a  lo - r  hi;
  if (test > 0)
    seed = test;
  else
    seed = test + m;
  return seed;
}

#   undef a
#   undef m
#   undef q
#   undef r


Die Qualität dieser Zufallszahlen ist gut; beispielsweise ist die
Ausgabe modulo 2 NICHT gleich 0, 1, 0, 1 ....

Zum Initialisieren wird meist time genommen, also:

PMrand_seed((long int)time(NULL));

Falls man time nicht zur Verfügung hat, dann muß man die Systemzeit in
Sekunden nehmen; jedenfalls etwas, was sich ständig ändert und
praktisch nicht (exakt) vorhersagbar ist.
Weil time nur als seed dient, also nicht direkt im Zufallswert steckt,
ist diese Lösung einfach und zuverlässig.

Wenn's um reinen echten Zufall geht, wird's normalerweise zu
aufwendig (www.true-random.com).
Gast #93309
Lesenswert?
• ▲
▼
Also ich habe das aus den C-FAQs genommen; ich habe es nicht komplett
nachgerechnet.
Und in den C-FAQs steht ein RAND_MAX von 2147483646 zu dem obigen
Generator.
Der Rückgabewert liegt im Intervall [1,2147483646].
Dass der Rückgabewert mindestens 1 ist, ist leicht zu sehen, aber das
Maximum 2147483646 ist, sehe ich nicht, aber das kann man ja
nachrechnen. Dafür bin ich zu faul und ich vertraue darauf, dass das
stimmt; in Zweifel würde ich einfach mal einige Millarden Werte
ausgeben lassen und Minimum, Maximum sowie Periode experimentell
bestimmen, denn letztlich entscheidend ist das, was hinten rauskommt
und es ist schneller programmiert als gerechnet.
#1364086
Lesenswert?
• ▲
▼
Tut mir leid so einen alten Thread wieder haraus zu holen, aber ich hab 
da ein paar fragen zu dem zufallsgenerator, der hier beschrieben wird.

1. Welche Seite ist deine Quelle, wenn ich nach C-FAQs und Park and 
Miller google finde ich nichts, zumindest nciht diesen Code hier

2. Stimmt diese Zeile vom Code?
1
signed long int test = a  lo - r  hi;

Gruß Sebastian

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.