Zeit genauer als Sekunde und Zufallsgenerator



  • Hi...
    Ich will ausgeben lassen wie lange mein Programm läuft. Hab das so gemacht:

    #include <time.h> 
    void main () 
    { 
    long int begin_time, end_time;
    time(&begin_time);
    // MACHE IRGENDWAS
    time(&end_time);
    cout << end_time-begin_time << endl;
    }
    

    Hab das unwichtige weggelassen. Ich bekomm das ganze aber nur in Sekunden ausgegeben. Geht das auch genauer? So in Milisekunden oder so?

    Und jetzt hab ich noch ein Problem: Ich brauch nen Zufallsgenerator. Hab das so gemacht:

    srand(time(0));
    v=fabs(rand()*rand())/(1*pow(10,9));
    

    Erste Frage: Wozu ist die 0 in time(0)? Hab das nur abgeschrieben.

    Zweite Frage: Die Werte sollen eigentlich zwischen 0 und 1 liegen und 10 Stellen hinter dem Komma haben. Wenn ich nur 1 rand() mache hab ich zu wenige Stellen, daher das Zweite. Dann teile ich durch 10 hoch 9 damit ich alles hinter das Komma bekomme. Außerdem hab ich manchmal negative Werte, hab aber keine Ahnung warum. Geht das auch besser?

    Hab die Such-Funktion benutzt aber nix vernünftiges gefunden. Sorry!

    Danke schonmal...



  • Hi
    Also erstens einmal sollte es heißen

    #include <ctime>
    //wahlweise mit
    using namespace std;
    
    int main () { //int, nicht void!
    

    Wir machen schließlich Standard C++.
    Dann gibt es die Funktion clock, die Auflösung davon erfährst du durch die Konstante CLOCKS_PER_SEC.
    clock gibt die beste annäherung zur prozessorzeit die das programm bekommen hat, seit einem bestimmten zeitpunkt, nachdem dein programm aufgerufen wurde. falls die prozessorzeit nicht verfügbar ist, gibt clock clock_t(-1) zurück.

    Das Null in time ist ein Zeiger auf ein time_t, in das der Wert von time zusätzlich gespeichert werden kann.

    srand solltest du übrigens nur einmal in deinem programm aufrufen, nämlich zu beginn. danach nie wieder.



  • Ich fürchte fast, rand()*rand() liefert dir keine zufälligen Werte.



  • Um Zeiten genau zu messen verwendet man am besten Betriebssystemspezifische Funktionen.

    zB unter Windows GetTickCount() und unter Unix gettimeofday()



  • Hm!?! Also ehrlich gesagt bin ich nicht so erfahren in C++. Das mit dem time.h hab ich nur abgeschrieben. Was ist an der ctime.h anders? Oder muß da kein .h hin wie bei dir?
    Und warum int und nicht void? Ich will doch garnichts zurück geben! Dann brauch ich bestimmt auch ein return 0 oder sowas?
    Das mit den namespaces hab ich eh noch nie kapiert, aber du sagst ja wahlweise.
    Ich denk mal dein Zeiter soll Zeiger heißen. Was ist denn ein time_t? Ein Variablentyp?
    Wofür man das srand braucht hab ich ebenso nicht verstanden. Im einem Tutorial hab ich nur gelesen, daß man damit eine neue Sequenz starten kann.

    Sorry für die vielen Fragen, aber ich hab mir über 10 Tutorials besorgt und in keinem steht etwas über time oder rand. Weiß also nicht woher ich informationen nehmen soll. Und ein Buch will ich mir nicht extra kaufen...

    @cd9000
    Wieso denn nicht? Ich hab bisher keine regelmäßigkeit feststellen können. Die Werte sind nur nicht in dem Bereich in dem ich sie brauche...



  • @Shade Of Mine
    Geht leider net, ich programmiere unter Windows, aber an der Uni muß es unter einem SunOS laufen...



  • Dr. von Rosenstein schrieb:

    @cd9000
    Wieso denn nicht? Ich hab bisher keine regelmäßigkeit feststellen können. Die Werte sind nur nicht in dem Bereich in dem ich sie brauche...

    1. Nicht alle Zahlen lassen sich als Produkt zweier kleinerer Zahlen darstellen (-> Primzahlen).
    2. Die Wahrscheinlichkeit, dass 0 rauskommt, ist extrem hoch, da nur einer der beiden Faktoren 0 sein muss.

    #include <iostream>
    #include <cstdlib>
    #include <ctime>
    using namespace std;
    //vc++ hack
    #ifdef _MSC_VER
    #define for if(0){}else for
    #endif
    
    // Liefert Zufallszahlen zwischen 0 und 4:
    int my_rand()
    {
    	return rand() % 5;
    }
    
    int main()
    {
    	srand(static_cast<unsigned>(time(0)));
    	int Zufall[17] = {0};
    
    	for(int i = 0; i < 10000000; i++)
    		Zufall[my_rand()*my_rand()]++;
    
    	cout << "Wahrscheinlichkeiten:" << endl;
    	for(int i = 0; i < 17; i++)
    		cout << i << ": " << Zufall[i] << endl;
    
    	return 0;
    }
    

    Liefert:

    Wahrscheinlichkeiten:
    0: 3602109
    1: 400115
    2: 800936
    3: 800761
    4: 1197761
    5: 0
    6: 797994
    7: 0
    8: 800730
    9: 400778
    10: 0
    11: 0
    12: 799272
    13: 0
    14: 0
    15: 0
    16: 399544
    

    Wie man sieht kommen viele Zahlen gar nicht vor, und die 0 ist wie erwartet viel zu häufig zu sehen.



  • Dr. von Rosenstein schrieb:

    Hm!?! Also ehrlich gesagt bin ich nicht so erfahren in C++. Das mit dem time.h hab ich nur abgeschrieben. Was ist an der ctime.h anders? Oder muß da kein .h hin wie bei dir?

    Die neuen Standardheader sind alle(?) wenn ich das richtig verstanden habe, um einige Funktionen erweitert worden und haben keine .h mehr am Ende.

    Dr. von Rosenstein schrieb:

    Und warum int und nicht void? Ich will doch garnichts zurück geben! Dann brauch ich bestimmt auch ein return 0 oder sowas?

    Der C++ Standard verlangt int. Man braucht keine return 0, ich mache es trotzdem, zumal bei eröffnen eines neuen Projektes dies immer so da steht.

    Dr. von Rosenstein schrieb:

    Was ist denn ein time_t? Ein Variablentyp?

    Ja, time_t ist ein eigener Variablentyp. Gehört zur ctime bzw. wird von dieser u.a. geliefert.

    Dr. von Rosenstein schrieb:

    Sorry für die vielen Fragen, aber ich hab mir über 10 Tutorials besorgt und in keinem steht etwas über time oder rand. Weiß also nicht woher ich informationen nehmen soll. Und ein Buch will ich mir nicht extra kaufen...

    Tutorials sind so das letzte was ich empfehlen würde, außer das von Volkard (habe leider den Link nicht), gefiel mir beim Überfliegen ganz gut. Ansonsten sollte man, wenn man C++ lernen will schon mal ein paar €uros in ein Buch investieren (es lohnt sich). Wenn dich nur die Funktionsweise von z.B. ctime interessiert solltest du mal im Internet nach einer Referenz suchen.

    Code-Hacker



  • Okay, also:

    In der Klammer von time() kann ich eine Variable (oder besser ein Zeiger) vom Typ time_t angeben in die die Zeit gespeichert wird. Aber wozu brauche ich das bei einem srand? Also die 0 mein ich. Interessiert mich nur, ist aber eigentlich egal, ist halt so.
    Was beinhaltet denn ein time_t? Die Zeit in Millisekunden als langes Integer? Oder irgendwie formatiert? Ich denk ich kann damit rechnen, also ein time_t von einem anderen abziehen oder so?
    Wofür braucht man denn diesen Typ wenn das auch geht:
    long int begin_time;
    time(&begin_time);
    ?

    Das ein zweimaliges rand keine Zufallszahlen ergibt hab ich eingesehen. Was ich jetzt aber immernoch net weiß ist, wie ich eine Zufallszahl zwischen 0 und 1 hinbekomme. Und diese soll 10 Stellen hinter dem Komma haben, aber das ist eher zweitrangig.

    ctime ist also neuer als time.h? Und clock liefert mir die Zeit in Millisekunden wenn die Konstante CLOCKS_PER_SEC 1000 ist? Verwende ich clock genauso wie time?

    Also das
    int main
    und nicht
    void main
    ist Standart? Aber void frisst der Compiler trotzdem? Warum man das gemacht hat kann mir nicht zufällig jemand sagen? Ich seh denn Sinn darin nicht ganz. Aber wie oben schon: Ist eigentlich egal, ist halt so!

    Sollte ich wissen wofür das srand ist? Oder ist das auch egal? Hab nur gemerkt, daß wenn ich es weglasse sich bei 2 Durchläufen die Zahlen sich wiederholen.

    Mit Büchern ist das Problem daß man sich schnell verkaufen kann! Sind meistens nicht billig die Teile und nach ner Woche merkt man dann, daß es garnicht so gut ist wie man dachte. Aber das ist ein anderes Problem was mit dem hier nichts zu tun hat
    Buch

    Danke nochmal...



  • Dr. von Rosenstein schrieb:

    In der Klammer von time() kann ich eine Variable (oder besser ein Zeiger) vom Typ time_t angeben in die die Zeit gespeichert wird. Aber wozu brauche ich das bei einem srand? Also die 0 mein ich.

    time(0) gibt die aktuelle Zeit zurück und mit cd9000s srand wird der Random-Seed je nach Systemzeit neu gesetzt.

    Was beinhaltet denn ein time_t? Die Zeit in Millisekunden als langes Integer? Oder irgendwie formatiert? Ich denk ich kann damit rechnen, also ein time_t von einem anderen abziehen oder so?

    http://rabbit.eng.miami.edu/info/functions/time.html#time_t

    Wofür braucht man denn diesen Typ wenn das auch geht:
    long int begin_time;
    time(&begin_time);

    Es ist IMO nicht garantiert dass das funktioniert; time_t ist portabler.

    Das ein zweimaliges rand keine Zufallszahlen ergibt hab ich eingesehen. Was ich jetzt aber immernoch net weiß ist, wie ich eine Zufallszahl zwischen 0 und 1 hinbekomme.

    Die Syntax von std::rand() ist "rand()%maximum;".

    ctime ist also neuer als time.h?

    <ctime> ist C++, <time.h> ist C. (Wobei ctime im Grunde auch die gleichen Funktionen anbietet wie <time.h> allerdings im std-Namespace

    ...

    Hm, noch mehr Fragen?
    Kauf Dir ein vernünftiges Buch, das wird mir zu anstrengend!

    edit: tags



  • Danke dir, hat mir erstmal geholfen. Hat mir zumindest Ansätze geliefert mit denen ich Probieren oder weiter suchen kann.

    Irgendwie habt ihr doch Recht, ich sollte mir ein Buch kaufen. Werd mal die Liste durchkucken...



  • Hi,

    DR.von Rosenstein schrieb:
    Mit Büchern ist das Problem daß man sich schnell verkaufen kann! Sind meistens nicht billig die Teile und nach ner Woche merkt man dann, daß es garnicht so gut ist wie man dachte

    Falls es bei euch in der Nähe eine Bücherrei geben sollte(ich wohn in München 😃 ) geh rein, leihe dir alles aus was nur ein bisschen mit
    Programmierung zu tuen hat und bring am nächsten tag alles was du nicht
    brauchst zurück. Ich habe mir heut 9Bücher aus zwei Büchereien ausgeliehen
    und 7 sind schrott, oder nicht das was der Titel erwarten lässt.

    Deshalb lei dir ein Buch aus bevor du es kaufst, zu 90% ist es eh schwachsinn.

    http://www.robsite.de/tutorials.php?tut=c
    Da gibt es auch Volkard und ne menge anderen guten Kram.

    cu max



  • Das Volkard-Tut kenn ich, ist gut, hat mir aber trotzdem net helfen können. Auf deiner Seite gibts ja ne Menge! Werd ich morgen mal durchschauen. Danke...



  • Mein Übungsgruppenleiter hat mir gesagt wie ich ne Zufallszahl zwischen 0 und 1 am besten hinbekomm:

    double random = rand(); // integer zwischen 0 und RAND_MAX
    random /= RAND_MAX; // double zwischen 0 und 1

    Ist doch eigentlich ganz einfach oder? Warum bin ich da net drauf gekommen....



  • Dr. von Rosenstein schrieb:

    Mein Übungsgruppenleiter hat mir gesagt wie ich ne Zufallszahl zwischen 0 und 1 am besten hinbekomm:

    double random = rand(); // integer zwischen 0 und RAND_MAX
    random /= RAND_MAX; // double zwischen 0 und 1

    Ist doch eigentlich ganz einfach oder? Warum bin ich da net drauf gekommen....

    Jo, ist ne passable Möglichkeit... Die Verteilung wird auch recht gleichmäßig sein.


Log in to reply