www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR und Zufallszahlen


Autor: Jens-Erwin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

möchte Zufallszahlen einsetzen - aber wie.


DA-Wandler brauche ich - kann ich nicht verwenden.


Bisher habe ich Zufallszahlen im SRAM "gesammelt" (z.B. beim
Verändern des AD-Wertes Timer auslesen)

Bin über alle Erfahrungen damit dankbar.

Gruß Jens-Erwin

Autor: Hartmut Gröger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jens-Erwin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja danke --- Schieberegister geht,

habe die Frage ins richtige Forum gestellt, nicht hierher - Verzeiung

Autor: nobody0 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: nobody0 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Korrektur: Das Maximum war um 1 zu groß angegeben; richtig ist:

#   define PMRAND_MAX 2147483646        // Max. output

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wieso?
War doch korrekt?
Höchste positive Zahl mit 32 Bit ohne Vorzeichen (minus) ist doch
01111111111111111111111111111111 (7FFFFFFF).
In Dezimal 2147483647.
Oder nicht?

Gruß
Andi

Autor: nobody0 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sebastian B. (m0nkey)
Datum:

Bewertung
0 lesenswert
nicht 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?
signed long int test = a  lo - r  hi;

Gruß Sebastian

Autor: wieder (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

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

Bewertung
0 lesenswert
nicht lesenswert
Sebastian Baier schrieb:

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

Da müssen klarerweise * dazwischen.
Die sind von der Forensoftware ausgefiltert worden und als Formatierung 
für Fettdruck umgesetzt worden.

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.