suche portable funktion für random numbers die funktioniert......
-
hi folks!
habe aus der den libc docs von delorie mal folgendes beispiel leicht modifiziert:
original:
/* random pause */ srand(time(0)); for (i=rand(); i; i--);
meine version:
#include <stdlib.h> int main(int argc, char *argv[]) { srand(time(0)); printf("%d\n", rand()); return 0; }
sollte ja keinen grossen unterschied machen (das eine pausiert zufällig lang, das andere zeigt die zufallszahl an...)
ist als ANSI C deklariert, sollte also auch mit dem MingW gehen.
die zahlen die ich bekomme sind aber alles andere als zufällig und zählen im sekundentakt hoch.also: gibt es eine (ANSI C, also portable) funktion wie rand(), die aber funktioniert, oder wie gehe ich richtig mit rand() und srand um?
vielen dank im voraus,
gruss,---loki
-
Wenn du Zufallszahlen willst:
#include <stdio.h> #include <stdlib.h> #include <time.h> int main(int argc, char **argv) { long L; int i; time(&L); srand(L); for (i=0;i<100;++i) /*EDIT : Semikolon vergessen*/ printf("%d\n", rand()); return 0; }
-
habe das jetzt mal so kompiliert.
wenn ich die resultierende exe mehrfach hintereinander starte (so alle 2 - 3 sec.) dann bekomme ich folgende (nicht wirkliche sehr unterschiedliche) zahlen:29866 29869 29872 29876 29879 29879 29882 29885 29889 29889 29892 29895 29899 29902 29905
liegt das an meinem compiler/system oder and dem code?
gruss,
---loki
-
Das liegt aller Wahrscheinlichkeit nach an deinem System. Ich hab hier (Linux kernel 2.6.8.1) grad eben das gekriegt:
153857681 929549815 611789480 312618430 4020629 1854682148 1538258119 1233384124 945737258 640548143 1397649195 1097619340 791844331 1566179044 187827835 2023668487 1721815025 1417366686 1123342893 806744109 2052654524 372099584
Es gibt auffällig viele Zahlen im Bereich um 1-2 Milliarden, was auf eine Gauß-Verteilung schließen lässt, aber ansonsten wirkt das doch recht zufällig; am Code liegts also nicht, und um Zufallszahlen kümmert sich in aller Regel das Betriebssystem.
-
ich habs grad mit mingw unter wxp (gcc version 3.2.3) ausprobiert und kriege
zufaellige zaehlen...
am compiler scheints mal nicht zu liegen.
-
Kinder, das fragt alle paar Tage jemand. time() liefert die Zeit in Sekundenauflösung zurück, und wenn du den Zufallszahlengenerator auf den gleichen Wert initialisierst, liefert er auch das gleiche Ergebnis. Also wenn das Programm echt so oft gestartet werden soll, dann musst du dir einfach eine hochauflösendere Zeitangabe besorgen. Und wenn das Programm länger läuft, hast du soundso kein Problem (weil du srand() nur einmal am Anfang aufrufen sollst).
-
wieso nur einmal am anfang aufrufen?
verstehe ich nicht.anyway: woher bekomme ich eine hochauflösende/sehr schnell wechselnde zahl?
habe es mit ftime probiert:ftime (&time1); srand(time1.millitm);
das problem ist dass die millisekunden nur in 10er-schritten aktualisiert angezeigt werden.
wieso?
-
loki1985 schrieb:
wieso nur einmal am anfang aufrufen?
verstehe ich nicht.anyway: woher bekomme ich eine hochauflösende/sehr schnell wechselnde zahl?
habe es mit ftime probiert:ftime (&time1); srand(time1.millitm);
das problem ist dass die millisekunden nur in 10er-schritten aktualisiert angezeigt werden.
wieso?
Bitte denken sie jetzt! Was passiert, wenn man den Zufallszahlen-Generator vor jedem Aufruf mit einer Zahl initialsiert? Richtig, genau diese Zahl wird ausgegeben. Was bedeutet das für dich? Noch mal richtig geraten. Einmal initialisieren mit srand(), n-fach rand() aufrufen und eine tolle Zufallszahl zurückbekommen.
Bis denn,
Tobias
-
Denkt noch mal nach, Jungs. Normalerweise sollte ein leicht unterschiedlicher seed schon dazu führen, dass die Zufallszahlenreihe ganz anders anfängt. Dass sie so oder so anders verläuft, setze ich jetzt einfach mal voraus, ansonsten baut das OS da nämlich richtig Mist; aber es darf auch nicht passieren, dass der Anfang der Reihe auf diese Weise mit dem Seed korrelliert, sonst kannste mindestens die erste Zahl nämlich wegschmeißen.
Das bedeutet übrigens auch, dass das Problem mit einem höher auflösenden Taktgeber nicht gelöst ist, weil der einzige Effekt aller Wahrscheinlichkeit nach lediglich eine Vergrößerung der Schrittbreite wäre, und damit ist die Sache genau so hinfällig.
-
loki1985 schrieb:
anyway: woher bekomme ich eine hochauflösende/sehr schnell wechselnde zahl?
Da kannst du nur auf plattform-spezifische Funktionen zurückgreifen. Unter Windows gibts da zB die Performance Counter (Stichwort: QueryPerformanceCounter). Wenn du was mit Assembler anfangen kannst, dann such mal nach rdtsc.