mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Zufallszahlengenerator für 8051


Autor: Thomas Feibel (kv3000)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ich würde gerne eine Zufallszahl mit der Funktion rand bzw srand
erzeugen. Das Beispiel von www.keil.com funktioniert leider nicht:

#include <stdlib.h>
#include <stdio.h> /* for printf */

void tst_rand (void) {
  int i;
  int r;

  for (i = 0; i < 10; i++) {
    printf ("I = %d, RAND = %d\n", i, rand ());
  }
}


MFG KV3000

Autor: Profi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und was funktioniert nicht?
Vielleicht musst Du noch was includen, damit er RAND kennt, z.B.
math.h

Schau mal nach, was RAND zurückliefert, ist das wirklich int (%d) oder
float?
Je nach Implementierung kann man den Wertebereich auch als Argument
angeben: rand(1000) erzeugt Zahlen im Bereich 0..999 oder 1000.

Pseudozufallszahlen kann man auch leicht selbst generieren mit einem
CRC-Generator und anschließender Skalierung.

Autor: KV3000 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Der Fehler: es werden einfach keine Zufallszahlen erzeugt.
Bei meinem vorigen Post hab ich eh ein Bild mit den Warnings
hochgeladen.

Ich halte es für äußerst unwahrscheinlich, dass da noch weitere
Bibliotheken aufgerufen werden müssen. - Ich hab das Beispiel von der
Herstellerseite des Progtools kopiert. - Trotzdem scheint der Compiler
die rand-Funktion, die normalerweise in der stdlib sein sollte nicht zu
finden.

CRC-Generator? Kannst bitte einen Link zu einem Beispiel posten?


MFg KV3000

Autor: Kai Riek (kairiek)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

schau mal hier: http://homepage.mac.com/afj/lfsr.html Du kannst dir
einen Zufallsgenerator selber programmieren, indem du ein
Rückgekoppeltes Schieberegister wie im Link beschrieben verwendest.

Wenn du mehr Infos suchst: Google Stichworte -> Linear Feedback Shift
Register(s). Ich habe mich da mal ne Zeit lang mit beschäftigt und
Google ist da sehr gut. Vielleicht findest du ja auch ein C Code
Beispiel das dir weiter hilft.

MFG

Kai

Autor: Kai Riek (kairiek)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachtrag zum C Code: Die gleiche Seite, gleich am Anfang. Hier der
direkte Link http://homepage.mac.com/afj/lfsr.c

MFG

Kai

Autor: Detlef A (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dett Ding macht Zufall, rein und klar wie ein Bergquell. SINT32 ist nen
signed integer mit 32 Bit. Vorsicht allerdings: z.b. Visual C macht
signed- Zufallswerte, Bit 31 ist also manchmal gesetzt, AVR-GCC zeigt
in Bit 31 immer ne Null, Grund ist mir nicht so richtig klar.

Spaß!
Detlef

#define IA ((SINT32)16807)
#define IM ((SINT32)2147483647)
#define IQ ((SINT32)127773)
#define IR ((SINT32)2836)
#define MASK ((SINT32)123459876)


/*********************************************************************** 
*******/
SINT32 zufall() {
/*********************************************************************** 
*******/
static SINT32 idum=2;
SINT32  k;
      idum ^= MASK;
      k=(idum)/IQ;
      idum=IA*(idum-k*IQ)-IR*k;
      if (idum < 0) idum += IM;
      k=(idum);
      idum ^= MASK;
      return k;
}

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.