Zufallsprinzip in C++ ?



  • also mit dem ersten, dass von 10 Zahlen 6 mal die 9 und 4 mal die 5 dabei ist, das würde ich so machen:

    // ist nur PseudoCode...
    if(ZufallsZahlZwischen1und10 > 6)
      x = 5;
    else
      x = 9;
    

    so in etwa, ich hoffe du siehst was ich meine...

    Gruß, Maxi



  • @ Marc++us:

    Also wenn ich das srand() vor der Schleife mache, dann kommen nur im Sekundentakt neue Zahlen, mache ich es in die Schleife, kommen bei mir immer andere zahlen heraus, was ist also effizienter? -Ich würde sagen, wenn man srand() in die Schleife nimmt.

    Edit: Ich weiß aber nicht, ob das jetzt nur bei mir so ist 😉

    [ Dieser Beitrag wurde am 26.06.2003 um 10:39 Uhr von Spieleprogrammierer editiert. ]



  • srand() initialisiert den zufalls generator.

    srand() wird nur EINMAL aufgerufen. siehe FAQ



  • Original erstellt von Spieleprogrammierer:
    Also wenn ich das srand() vor der Schleife mache, dann kommen nur im Sekundentakt neue Zahlen.

    Kann aber eigentlich nicht sein. srand initialisiert und rand führt den zufalls-algorithmus aus. wenn srand nur 1x aufgerufen wird kann es doch nichts mit dem sekundentakt zu tun haben.

    Original erstellt von Spieleprogrammierer:
    was ist also effizienter? -Ich würde sagen, wenn man srand() in die Schleife nimmt.

    Es wäre wenn du Recht behalten würdest effektiver, aber nicht effizienter. Guck nochmal genau nach. Ich kann mir nicht vorstellen, dass das mit dem srand in der schleife besser klappt als mit srand außerhalb.



  • @spieleprogrammierer

    genau dein beispiel mal starten (wenn die fehler ausgemerzt sind...)

    es kommt der schnelligkeit wegen immer die gleiche zahl.

    vergiss die ctime nicht und wenn schon stdlib, dann cstdlib

    du wirst sehen, es funzt net.



  • Probier das hier mal aus und sag wo die Zahlen doppelt sind bitte:

    // HIer sollten die Zahlen mehrfach vorkommen
        for(int i = 0; i < 100; ++i)
        {
            srand(time(0));
            cout<<rand()<<endl;
        }
        return 0;
    
    // Das sollte immer ne andere Zahl
        srand(time(0));
        for(int i = 0; i < 100; ++i)
        {
            cout<<rand()<<endl;
        }
        return 0;
    

    Interessiert mich.



  • Wie gesagt, bei mir isses andersrum.



  • Also ich habs jetzt mit dem Code probiert:
    EDIT: Leicht abgeändert natürlich, da der obere nicht kompiliert werden konnte

    #include<iostream>
    #include<cstdlib>
    #include<ctime>
    
    // Edit:
    using namespace std;
    
    int main (int argc, char** argv) // Edit: char argv**
    {
      int i;
      int zufall;
      int hoechstwert=100;
      int mindestwert=10;
      for(i=0;i<10;++i)
      {
        srand(time(0)); // berechnet einen zufallswert anhand time(0)
        // time(0) liefert Sekunden die seit 1.1.1970 0.00 Uhr vergangen sind.
    
        zufall=rand()%(hoechstwert-mindestwert+1)+mindestwert;
        // holt sich einen Wert zwischen 100 und 10, gibt ihn danach aus.
        cout<<zufall<<"\n";
      }
      getchar();
      return 0;
    }
    

    Output:

    93
    93
    93
    93
    93
    93
    93
    93
    93
    93
    

    Ändere ich ihn so, dass srand vor der Schleife steht ist der Output:

    49
    13
    29
    33
    99
    31
    91
    19
    22
    66
    

    🙄

    [ Dieser Beitrag wurde am 26.06.2003 um 11:17 Uhr von MaSTaH editiert. ]



  • Spieleprogrammierer ist halt ein Troll 🙄



  • So, jetzt hab ich mich auch mal registriert.
    danke für die vielen Antworten. Werde gleich mal ausprobieren, ob das alles funtzt.

    Ps: Ich wollte bald mal ein Proggy schreiben, dass mir das Fußballergebniss voraussagt. (Ich bin Fußballverrückt 😃 ) Besser gesagt, ich will, dass der PC ein zufälliges Ergebniss liefert, aber ich vorher das beeinflussen kann. Das z.B. der Verein x 70% Chancen auf den Sieg hat und y nur 30% Und die heimmanschaft hat immer einen Vorteil von 5% usw. danach liefert der mir 10 unterschiedliche Ergebnisse aus und der Durschnitt ergibt dann das wirkliche Ergebniss. (ich weiß, ich weiß, ihr haltet mich vielleicht für -piep-, aber ich bin nunmal verrückt 😃 )



  • Ach so... das ist aber einfach. 😉

    Du mußt den Zufallszahlengenerator einfach noch gewichten.

    Normal liefert rand Zahlen von 0 bis 32767 (ist eine Kontante RAND_MAX oder so ähnlich).

    Nun mußt Du einfach soundsoviel Prozent davon als A werten und den Rest als B:

    A soll zu 70% gewinnen, B zu 30%:

    bool a_gewinnt;
    if (rand() < ((double)RAND_MAX * 0.70))
       a_gewinnt = true;
    else
       a_gewinnt = false;
    

    Extra leicht verständlich gehalten... wenn also die von rand() gelieferte Zahl im Bereich 0.. bis in den unteren 70% der möglichen Zahlen liefert, dann gewinnt a. Also mit einer Wahrscheinlichkeit von 70%.



  • Original erstellt von DasPinsch:
    Spieleprogrammierer ist halt ein Troll 🙄

    Nein, du, ich sage lediglich das, was bei meinem BCB3 geschehen ist, und bei mir kommen nur unterschiedliche zahlen, wenn srand in der schleife ist. Ist bei mir srand außerhalb der schleife, kommen nur im Sekundentakt andere Zahlen. Dafür kann ich auch nichts. Und dass ich ein "troll" sein soll, sehe ich als Beleidigung, da es genug themen gibt, in denen das vin DIR geschrieben wurde.

    PS: Du bist ein troll, nicht ich.



  • Das Programm hat garantiert keine Laufzeit von über einer Sekunde, also ist deine Aussage Schwachsinn. Wenn du meinst, dass du das Programm mehrmals pro Sekunde startest, und dann nur im Sekundentakt andere Startwerte kommen, hast du vollkommen Recht. Das hättest du aber dazusagen müssen anstatt dich hier in Diskussionen zu stürzen die du nicht verstehst.

    PS: Offensichtlich verstehst du nichtmal, warum man dich Troll nennt. Weißt du überhaupt was das ist?



  • kann man diesen spieleprogrammierer nicht irgendwie abstellen? wie kann man immer wieder mit so einer ueberheblichkeit so einen unsinn reden?

    das mit dem fussball auszulosen ist ja nun wirklich quark. mit einem versuch nur aus spass an der freud mag ja noch sinn machen, aber 10mal und dann mitteln, das versucht schon wissenschaftlich zu sein, dann kannst du aber gleich den erwartungswert deiner aufgestellten trivialen verteilung berechnen, den du ja schon kennst, sonst haettest du die zahlen nicht so aufgestellt. 🙂



  • @SP sicher dass du das nicht ausversehen vertauscht hast?? 😃 :p 😃
    Also als ich das einmal inner schleife hadde, hatt mich der kompiler mit Fehlern dichtgemüllt. Es passierte jedenfalls nur Murks.

    Außerdem:
    time(NULL) liefert nur im Sekundentakt einen neuen wert. Fragst du bei 1.0s ab meinetwegen 100 bei 1.2s immernoch und auch bei 1.4s! Was darüber passiert: ka ob die Funktion rundet oder sonstwas, aber ich denke nicht.
    Ist rand() aber einmal initialisiert, dann wird es egal wann du fragst immer andere werte ausspucken, da es dann unabhängig von der Zeit läuft.

    Du musst dich irgendwo "vercoded" haben *g*

    PS: Na nu regt euch doch ab, er kann ja auchnix für seinen BCB _____

    PPS: Nein, Ich mag den BCB net! ;P

    [ Dieser Beitrag wurde am 26.06.2003 um 16:59 Uhr von THE_FreaK editiert. ]



  • wenn srand() in der schleife unterschiedliche werte initialisiert liefert dein tein nicht sekunden sondern Ticks... und das ist imho nicht so.



  • tein==time
    ich bin was besoffen...



  • Original erstellt von Bashar:
    **Das Programm hat garantiert keine Laufzeit von über einer Sekunde, also ist deine Aussage Schwachsinn. Wenn du meinst, dass du das Programm mehrmals pro Sekunde startest, und dann nur im Sekundentakt andere Startwerte kommen, hast du vollkommen Recht. Das hättest du aber dazusagen müssen anstatt dich hier in Diskussionen zu stürzen die du nicht verstehst.

    PS: Offensichtlich verstehst du nichtmal, warum man dich Troll nennt. Weißt du überhaupt was das ist?**

    Hab ich gesagt,dass ich genaudas selbe kompiliert habe? Nzr das Prinzip war bei meinem genauso, ansonstenlief mein kompiliertes Programm, um ganz genau zu sein, unendlich lang, denn da war es eine while(true) -Schleife.



  • und

    sleep(1000);
    

    damit du die zahl lesen kanst :OÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞ


Anmelden zum Antworten