Grosse Zufallszahlen mit rand()



  • Hallo.

    Habe das Problem, dass rand() mir Zufallszahlen bis max. 32768 generiert. Dafür sei die Konstante RAND_MAX zuständig.

    Da rand() jedoch ein 'int' zurückgibt und 'int' bei c++/Intel CPUs 4 Byte gross ist, hätte ich eigentich gerne, dass rand() eine grössere Zahl zurückgibt.. wie kann man RAND_MAX neu definieren?

    Meine Zufallszahl müsste 9 Stellen besitzen.



  • sky21 schrieb:

    Hallo.

    Habe das Problem, dass rand() mir Zufallszahlen bis max. 32768 generiert. Dafür sei die Konstante RAND_MAX zuständig.

    Da rand() jedoch ein 'int' zurückgibt und 'int' bei c++/Intel CPUs 4 Byte gross ist, hätte ich eigentich gerne, dass rand() eine grössere Zahl zurückgibt.. wie kann man RAND_MAX neu definieren?

    Meine Zufallszahl müsste 9 Stellen besitzen.

    a) zusammenstückeln
    return rand()|(rand()<<10)|(rand()<<20);

    b) nen bessern generator nehmen
    //seeds ungetestet

    #ifndef RANDOM_HPP
    #define RANDOM_HPP
    
    #include "types.hpp"
    
    //multiply-with-carry prng
    //quelle
    //http://cliodhna.cop.uop.edu/~hetrick/na_faq.html
    //TODO: testen, ob alle seeds!=0 gute seeds sind
    
    class Random{
    private:
    	u64 x;
    public:
    	Random(u64 seed){
    		x=seed|(u64(1)<<32);
    	}
    	u32 operator()(){
    		x=1967773755*(x&0xffffffff)+(x>>32);
    		return x;
    	}
    };
    
    #endif
    


  • volkard schrieb:

    return rand()|(rand()<<10)|(rand()<<20);

    Das habe ich auch schon versucht, 3 Blücke à 3 Zeichen grosse Zahlen zu generieren und zusammenzusetzem.
    Das Problem ist hier jedoch, dass die Gesamtzahl dann noch Modulo <2-Stellige Primzahl> 0 ergeben muss.
    In der Praxis geht das eben leider verdammt lange, muss so ein Fall gefunden wird...



  • sky21 schrieb:

    volkard schrieb:

    return rand()|(rand()<<10)|(rand()<<20);

    Das habe ich auch schon versucht, 3 Blücke à 3 Zeichen grosse Zahlen zu generieren und zusammenzusetzem.
    Das Problem ist hier jedoch, dass die Gesamtzahl dann noch Modulo <2-Stellige Primzahl> 0 ergeben muss.
    In der Praxis geht das eben leider verdammt lange, muss so ein Fall gefunden wird...

    berechne doch einfach den bigrand und dann b=int(b/97)*97;



  • sky21 schrieb:

    Das Problem ist hier jedoch, dass die Gesamtzahl dann noch Modulo <2-Stellige Primzahl> 0 ergeben muss.
    In der Praxis geht das eben leider verdammt lange, muss so ein Fall gefunden wird...

    So 'ne Zahl ist auch nicht zufällig.

    Bye, TGGC (Demo or Die)


Anmelden zum Antworten