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.


Anmelden zum Antworten