www.mikrocontroller.net

Forum: PC-Programmierung Zufallszahlen


Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich möchte einen Zufallszahlengenerator nach der linearen 
Kongruenzmethode für mein Programm schreiben. Nun habe ich folgendes 
Problem.

Zufallszahlen: 1-12;
int rand (int d)
{
int b=3,m=11;
d=((d*b+1)%m)+1;


return d;

}

Es werden Zahlen von 1 - 12 erzeugt aber die Zahlen wiederholen sich 
nach der 4 oder 5 Zahl(gleiches Muster)

Brauche aber die Zahlen von 1-12 und am Besten wäre es wenn sie wirklich 
zufällig(kein Muster)

Autor: Mitglied einer Uni-Amateurfunkgruppe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier sind u. a. die Kriterien für die Periodenlänge aufgeführt:

  http://de.wikipedia.org/wiki/Kongruenzgenerator

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe jetzt  b=7 und m=12;
b-1 ist durch alle Primfaktoren von m teilbar
Aber Ausgabe

2,4,6,8,10,12,2,4,6,8,10,12,......

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du kannst auf diese Weise keine Zufallszahlen erzeugen. Alles was du 
erzeugen kannst, ist eine Folge von Pseudozufallszahlen, die jedes Mal 
gleich aussieht. Siehe Artikel Zufallszahlen.

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber es muss doch eine Möglichkeit geben diese Folge nicht n+2; aussehen 
zulassen sondern z.B:

1,6,3,8,5,11,12,10,2,4,7,1,6,3,8,....

Autor: Xident (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
typedef unsigned long uint32;
typedef signed long int32;

#define  M  ((1U<<31) -1)
#define  A  48271
#define  Q  44488    // M/A
#define  R  3399    // M%A; R < Q !!!

static uint32 SEEDED_RANDOM=314235;

static int rand_r(uint32* seed)
{   int32 X;

    X = *seed;
    X = A*(X%Q) - R * (int32) (X/Q);
    if (X < 0)
  X += M;

    *seed = (uint32)X;
    return (int)X;
}
void randomize(uint32 seed)
{
  SEEDED_RANDOM=seed;
}
int random(void)
{
  SEEDED_RANDOM+=_TIMER;                     // TIMER ist auch vom TYP 
uint32 und darf
  return rand_r(&SEEDED_RANDOM);             // gerne im interrupt oder 
wie auch immer
} 
// inkrementiert werden!



int main(void)
{
       randomize((int32)random);
       printf("%d zufall\n",random());
       return 0;
}


Natürlich nicht optimiert. Aber es funktioniert ganz gut...

Gruß Xident

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.