ZufalsZahlen



  • Hi, ich brauche zufalls Zahlen im Berreich von 1-1.000.000 und es dürfen keine doppelten Zahlen vorkommen.

    Nun kann rand() ja irgend wie nur 32k verschiedene Zahlen zurückgeben.
    Wenn ich vor jedem rand() ein srand((unsigned int) time(NULL)); mache dauert das anlegen von 100 Zufallswerten schon ewig ... von 1.000.000 mal ganz abgesehen.

    Hat zufällig jemand eine Idee wie ich das realisieren könnte ?





  • Ja war ganz hilfreich.

    Aber obwohl mein Programm nun eigentlich genügend zufallszahlen herstellen kann dauert es am 100.000 zufalls zahlen mega lange.

    ggf. liegt es an der Art wie ich die abfrage mache ob eine Zahl schon mal vorgekommen ist:

    a.clear(); // Inhalt löschen
    
    	for(int i=0; i <= n;)
    	{	//
    		// Zufahls Zahl erzeugen
    		int rnd1 = rand();
    		int rnd2 = rand();
    		int rnd3 = rand();
    		unsigned int zahl = ((rnd1 & 0x03) << 30) + (rnd2 << 15) + rnd3;
    
    		vector<int>::iterator k;
    		bool kommtvor = false;
    		for (k=a.begin();k!=a.end();k++)
    		{
    			if(*k == zahl)
    			     kommtvor = true;
    		}
    		if(!kommtvor)
    		{
    			a.push_back(zahl);
    			i++;
    		}
    	}
    

    a ist ein Vector<int> und dient dazu zu gucken ob die Zahl schon einmal vorkam so das ich nacher in a zufällige Zahlen habe welche sich nicht wiederholen.
    Kann natürlich auch sein das mein PC zu lagsam ist oder aber das nicht genug Spiecher für das Projekt freigemacht wird ( laut Taskmanager 890k was doch etwas wenig erscheint)



  • hm wenn die Zahlen nur je einmal vorkommen sollen nimm doch ein std::set bzw. das std::tr1::unordered_set, das sollte die Geschwindigkeit beim Nachschlagen deutlich erhöhen



  • hi,
    falls du 1 Mio. Zufallszahlen im direkten Zugriff, z.B. in einem Array halten willst und keine doppelt vorkommen darf, würde ich folgendes machen:
    Array 0..10^6-1 anlegen und in forschleife mit 0 bis 10^6-1 füllen. STL random- shuffle-funktion auf das array anwenden --> mischt den Inhalt des arrays gleichverteilt auf.

    Sehr guter Randomgenerator ist auch der Mersenne Twister von Makoto Matsumoto. Den hat mir mal jemand hier vom Forum empfohlen, und seither nehm ich den (alle anderen kannst du vergessen, auch was die Geschwindigkeit betrifft).

    vg. tesu


Anmelden zum Antworten