Zeit genauer als Sekunde und Zufallsgenerator



  • @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.


Anmelden zum Antworten