Forum: Mikrocontroller und Digitale Elektronik Zufallszahlengenerator für 8051


von Thomas F. (kv3000)


Angehängte Dateien:

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

von Profi (Gast)


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.

von KV3000 (Gast)


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

von Kai R. (kairiek)


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

von Kai R. (kairiek)


Lesenswert?

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

MFG

Kai

von Detlef A (Gast)


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;
}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.