Forum: PC-Programmierung Zufallszahlen


von Tom (Gast)


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)

von Mitglied einer Uni-Amateurfunkgruppe (Gast)


Lesenswert?

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

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

von Tom (Gast)


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,......

von Andreas S. (andreas) (Admin) Benutzerseite


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.

von Tom (Gast)


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,....

von Xident (Gast)


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

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.