aqe89 hat geschrieben:Mein Problem ist mit diesen Funktionen, dass die Zufallszahlen immer aufsteigend sind.
Zahl Diff
10533
10565 . 32
10601 . 36
10637 . 36
10670 . 33
.....
11176
11212 . 36
11248 . 36
11287 . 39
Ich finde das ein bisschen komisch.
Habe es 2 mal ausprobiert, sind immer aufsteigend aber andere Zahlen, aber immer ähnliche Differenzen immer zwischen 32 und 39.
Es liegt wahrscheinlich an der umrand Funktion, hatte dort mal eine anderen Lösung, gab aber immer einen Integer-Überlauf.
Weiss da jemand eine alternative? Bei Linux könnte man ja noch getpid() rein nehmen. aber bei Windows.
Code: Alles auswählen
unsigned long randtime()
{
unsigned long randome;
long min=10000, max=12000;
srand(time(NULL));
randome = umrand(min, max);
printf("%d msec\n",randome);
return randome;
}
unsigned long umrand( long min, long max)
{
unsigned long random=0;
unsigned long rnd = max - min + 1;
random=rand()%rnd+min;
return random;
}
Lass mich raten, du rufst die Funktion randtime() in einer Schleife auf? Wenn das so wäre, wäre dann das seltsame verhalten erklärbar. rand() ist nämlich keine funktion, um ZUFALLS zahlen zu erzeugen (dazu müsstest du von /dev/random lesen). rand() gibt nämlich PSEUDOzufallszahlen aus.
Anscheinend ist die Implementierung deiner Version ziemlich schwach.
Nun, aber jetzt zum Grund: Wenn du jedes mal nur randtime() aufrufst, wird jedes mal der seed neu initialisiert, und dann nur die erste Zufallszahl abgefragt. Anscheinend gibt der Algorithmus für die erste Zahl eine Zahl aus, die dem Seed sehr ähnlich ist.
Um wirklich halbwegs zuverlässige Zufallszahlen zu erzeugen, müsstest du nur _ein_ mal den seed mit srand() initialisieren, z.B. in der main() funktion. Versuchs mal.
Übrigens, ich hoffe die Zahlen werden nicht zur Verschlüsselung verwendet, denn rand() liefert eben nichtmal Zufallszahlen, sondern Zahlen die für einen Menschen zufällig aussehen. Das bedeutet, vielleicht sind diese Zahlen vorhersagbar.
Haters gonna hate, potatoes gonna potate.