Zufallszahlengenerator für 8051

OP #301842
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
Angehängte Dateien:
Gast #301843
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.
Gast #301844
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
#301845
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
Gast #301847
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren