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)
Hier sind u. a. die Kriterien für die Periodenlänge aufgeführt: http://de.wikipedia.org/wiki/Kongruenzgenerator
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,......
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.
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,....
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.