Zufall größer MAX_RAND



  • Hi!

    Ich habe gerade ewig nach nem Fehler in meinem proggi gesucht, und mir ist aufgefallen, dass rand() zu kleine Zahlen bringt. Ich hab mir jetzt ne Funktion geschrieben, weiß aber nicht, ob die gut verteilte zahlen bringt. Wäre nämlch wichtig. Hier der Code:

    UINT RandomNumber(UINT max)
    {
    	UINT z = 0;
    	z = rand();
    	while(z < 2 * max)
    	{
    		z *= 10;
    		z += rand();
    	}
    
    	return z % max;
    
    }
    

    oder wäre diese hier besser?

    UINT RandomNumber2(UINT max)
    {
         UINT n = max % MAX_RAND;
         UINT z = 0;
         for(int i = 0; i < n; i++)
              z += rand();
    
         return z % max;
    }
    


  • ..



  • meine Loesung:

    im Grunde Teil ich den Intervall von Zahlen, aus dem ich die Zufallszahlen will, in RAND_MAX grosse Teile. Waehle dann einen dieser Teile zufaellig aus. Innerhalb dieses Teiles kann ich dann eine RAND_MAX grosse Zahl auswaehlen.

    Pseudocode:

    Zufallsintervall = rand() % AnzahlIntervalle;
    Zufallszahl = rand() % RAND_MAX + RAND_MAX * Zufallsintervall.

    Sieht dann bei mir z. B. so aus:

    /*
     * choose a cell randomly and return its index in the cells_-vector
     * because rand() returns a maximum of ca. 32k, we need another algo
     * to choose numbers... e.g. with 786432 cells (1024x768 with 1 cell
     * per pixel), most of the cells would never get choosen
     */
    long MorphingTable::chooseCell()
    {
    	long choosen = rand() % cellCount_;
    
    	if (RAND_MAX < cellCount_)
    	{
    		int range = rand() % randMaxToCellsRatio_;
      		choosen += range * RAND_MAX;		
    	}
    
    	return choosen;
    }
    

Anmelden zum Antworten