Zufalls Generator



  • jaaa ^^ das is für mich mittlerweise normal und okay es gibt srand ( das es ürgentwas mit rand sein muss wusste ich ja aber egal ), aber nur ich weiß immernoch net welche datei ich dazu einbinden muss die ham alle immer so 3-5 header drinne



  • nach dem du den Zufalls generator initialisiert hast,

    erstelltst du eine Zufalls Zahl, von der du das Modulum von 2 nimmst,
    das sollte dir als erklärung reichen.



  • hab was von CStoll

    #include <cstdlib>
    #include <ctime>
    #include <iostream>
    using namespace std;
    
    int main()
    {
      srand(time(NULL));//einmal bei Programmstart
      for(int i=0;i<100;++i)
        cout<<i<<'\t'<<rand()<<endl;
      return 0;
    }
    

    sollte reichen, ich verabschiede mich dann mal^^



  • na dann viel spaß! 😉



  • hab n problem, muss 6 zufallszahlen herzaubern, es dürfen aber keine gleiche forhanden sein, hab da was geschrieben, irgendwie kommt da aber nix, bitte um ratschläge 🙂

    [/code]#include <cstdlib>
    #include <ctime>
    #include <iostream>
    using namespace std;

    int main()
    {
    int a,b;
    int z[5];

    srand(time(NULL));//einmal bei Programmstart

    for(int i=0;i<5;++i)
    {
    z[i]=rand()%49+1;

    for(int j=1; j<5; j++)
    {
    if(z[i]==z[j])
    {
    i--;
    break;
    }

    }

    }
    // z[i]=rand()%49+1;

    cout<<'\t'<<z[i];//rand()%49+1;
    return 0;
    }
    [code]



  • Du solltest in der inneren Schleife nur die bereits gespeicherten Zahlen kontrollieren (dazu änderst du die innere Schleife in "for(int j=0;j<i;++j)...").

    (PS: Wenn du code-Tags benutzt, dann bitte richtig herum - das [/code] kommt ans Ende ;))



  • das mit den doppelten zufallszahlen verhindern geht auch effektiver.. siehe z.b. hier:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-139206-and-highlight-is-*zufall*.html



  • hab jetzt den code n bissi verändert, hab noch das problem, bei 2 gleichen zahlen bekomm ich beide hintereinander aufn bildschirm nur jetzt anstatt von 5
    zufalsszahlen 6.
    wollte es mit der if bediengung zurechtrücken geht aba net!!!

    #include <cstdlib>
    #include <ctime>
    #include <iostream>
    using namespace std;
    
    int main()
    {
    
    	int z[5];
    
    	srand(time(NULL));//einmal bei Programmstart
    
    	for(int i=0;i<5;++i)
    
    	{
    			z[i]=rand()%49+1;
    
    			for(int j=0; j<i; j++)
    
    				{
    					if(z[i]==z[j])
    						{
    							i--;
    							break;
    
    						}
    
    				}
    
    	if(z[i]!=z[j])
    		{
    
    			cout<<'\t'<<z[i];
    		}
    	}
    return 0;
    }
    

    ps.life dein vorschlag is n bissi zu kompliziert, hab mich mit den klassen noch net beschäftigt, aba kommt noch 😃



  • Ich hätte da noch eine andere Idee, wie du deine Lotto-Ziehung machen kannst:

    set<int> zahlen;
    while(zahlen.size()<6)
      zahlen.insert(rand()%49+1);
    

    (das set<> stellt sicher, daß jedes Element nur einmal eingefügt werden kann, d.h. am Ende der Schleife stehen in "zahlen" 6 garantiert unterschiedliche Zufallszahlen drin)



  • CStoll schrieb:

    Ich hätte da noch eine andere Idee, wie du deine Lotto-Ziehung machen kannst:

    set<int> zahlen;
    while(zahlen.size()<6)
      zahlen.insert(rand()%49+1);
    

    (das set<> stellt sicher, daß jedes Element nur einmal eingefügt werden kann, d.h. am Ende der Schleife stehen in "zahlen" 6 garantiert unterschiedliche Zufallszahlen drin)

    ist doch (fast) genauso ineffektiv.. wie teuer ist denn insert? log n?



  • Ja, insert() ist O(log n) - der Test in deinem ursprünglichen Programm ist O(n)



  • CStoll schrieb:

    Ja, insert() ist O(log n) - der Test in deinem ursprünglichen Programm ist O(n)

    in meinem Programm ist er O(1), weil garkein Test stattfindet.. Das finden der n paarweise verschiedenen Zufallzahlen kosten somit nur O(n). Bei dir kostet das Ganze dann O(n logn) und bei der Version vom Threadersteller O(n²) und beides nur sofern keine Zahl doppelt gewürfelt wurde..



  • Um 6 aus 49 zu ermitteln, mache ich mir noch keine großen Gedanken über die Performance 😉 (und bei größeren Mengen würde ich wohl random_shuffle() verwenden). Und bedenkst du auch, daß deine Variante deutlich mehr Speicherplatz (und Zeit) benötigt, um die Suche überhaupt vorzubereiten? (gerade wenn nur eine kleine Teilmenge der möglichen Werte gesucht wird, dürfte selbst O(n²) günstiger sein als O(n+m))



  • du solltest aber bedenken, dass dein verfahren mit etwas pech einfach ewig dauert (wenn man davon ausgeht, dass rand echte zufallszahlen liefert).. Relevant wird das besonders, wenn sich dein n dem Wertebereich m stark annähert. So z.b. wenn du jetzt 48 paarweise verschiedene Zufallszahlen zwischen 0 - 50 suchen möchtest..

    random_shuffle ist für das Problem auch nicht unbedingt meine erste Wahl, da du damit einfach viel zu viel machst und dann nachher wieder ein Teil rausschmeißt (wobei random_shuffle dann besser wird wenn sich n m annähered (also genau umgekehrt))..



  • life schrieb:

    das mit den doppelten zufallszahlen verhindern geht auch effektiver..

    Wie, noch effektiver als wenn keine doppelten mehr drin sind? Also sozusagen *gar* keine doppelten mehr drin? Oder meinst Du vielleicht effizienter? :p
    Aber ne schöne Lösung! 😉

    Allerdings kann man die erwartete Anzahl an Schritten ausrechnen. Die Schätze ich mal auf knapp über 1, bei diesen Werten. Die Wahrscheinlichkeit, daß es terminiert liegt übrigens bei 1. Die für unendliches Weiterlaufen bei 0, es kann also eigentlich nicht unendlich lange laufen. Beliebig lange schon, aber halt nicht unendlich.



  • Jester schrieb:

    Allerdings kann man die erwartete Anzahl an Schritten ausrechnen. Die Schätze ich mal auf knapp über 1, bei diesen Werten. Die Wahrscheinlichkeit, daß es terminiert liegt übrigens bei 1. Die für unendliches Weiterlaufen bei 0, es kann also eigentlich nicht unendlich lange laufen. Beliebig lange schon, aber halt nicht unendlich.

    Beliebig lange kann aber schon ganz lange sein ;). Und im "worst-case" braucht der Algorithmus nunmal unendliche lange, obwohl die wahrscheinlichkeit für den "worst-case" bei 0 liegt (hört sich zugegebenermaßen irgendwie paradox an) 😉



  • Nein, dieser worst-case tritt sicher nicht ein. Seine Wahrscheinlichkeit liegt nämlich bei 0. 🙂



  • Auch wenn der Fall nie auftritt, denke ich, kann man ihn als worst-case bezeichnen.. oder was ist dann deiner Meinung nach der worst-case bei dem Algorithmus? :p



  • life schrieb:

    Auch wenn der Fall nie auftritt, denke ich, kann man ihn als worst-case bezeichnen.. oder was ist dann deiner Meinung nach der worst-case bei dem Algorithmus? :p

    Das ist natürlich ne berechtigte Frage.

    Aber wie relevant ist ein "worst-case", der nie eintritt?



  • "worst case" ist der schlechteste Fall, der eintreten KANN - von daher brauchst du etwas definitiv unmögliches nicht zu betrachten 😉


Anmelden zum Antworten