64Bit Zufallszahl



  • Hallo Leute,

    Ich brauche eine ziemlich große Zufallszahl. Was ich hier in den FAQs gefunden habe funktioniert nicht.

    Das habe ich versucht:

    unsigned long long randnumber;
    unsigned long randmax=4294967295; //2^32-1
    
    srand((unsigned) time(NULL)); 	
    
    randnumber = 1 + (unsigned) (rand()% randmax);	
    randnumber <<= 32;
    
    randnumber += 1 + (unsigned) (rand()% randmax);
    

    Der Compiler meckert an, dass in der Zuweisung von randmax was nicht stimmt:

    This decimal constant is unsigned only in ISO C90

    Naja, wenn ich es dann ausführe, wird zwar eine Zufallszahl erzeugt, aber scheinbar immer wieder die gleiche. Hat jemand ne Idee oder gibt es eine Zufallsfunktion für 64bit Zahlen?

    Danke.

    Günther



  • probier doch mal so:

    unsigned long long randnumber = ((unsigned long long)rand())<<32 + rand();
    


  • Danke,

    Also ich bekomme mit der Änderung folgende Zufallszahl (HEX)

    7D E7 1D F8 00 00 00 00 F4 D5 00 00 C0 EC D7 BE F4 57 01 00 38 EA 07 00 50 F0 07 00 02 00 00 00 17 D9 4C 59 00 00 00 00 00 00 00 00 68 EC 07 00 E4 EE D7 BE EC EE D7 BE 01 00 00 00 68 EC 07 00

    Die Warnung bleibt aber. Wenn ich das Programm in mehr als einer Sekunde Abstand losschieße sind die Zahlen sogar unterschiedlich, vermutlich wegen der Zeit, die als Startwert genommen wird. Das ist auf jeden Fall gut genug, jetzt muss nur noch die Fehlermeldung weg.

    Könnte ich denn auch eine 64-bit Grenze setzen? Dann könnte ich mir das Bit schieben sparen.

    Günther



  • Guenther schrieb:

    Also ich bekomme mit der Änderung folgende Zufallszahl (HEX)
    7D E7 1D F8 00 00 00 00 F4 D5 00 00 C0 EC D7 BE F4 57 01 00 38 EA 07 00 50 F0 07 00 02 00 00 00 17 D9 4C 59 00 00 00 00 00 00 00 00 68 EC 07 00 E4 EE D7 BE EC EE D7 BE 01 00 00 00 68 EC 07 00

    das ist aber ein klein wenig mehr als 64 bits, 512 oder so 😉



  • Guenther schrieb:

    Also ich bekomme mit der Änderung folgende Zufallszahl (HEX)

    Das sind aber keine 64 Bit. Sieht eher nach 64 Byte aus.

    Könnte ich denn auch eine 64-bit Grenze setzen? Dann könnte ich mir das Bit schieben sparen.

    Du kannst überhaupt keine Grenze setzen. rand liefert Werte zwischen 0 und RAND_MAX, darauf hast du keinen Einfluss. Ein Modulo mit einem Wert > RAND_MAX ist Unsinn. Du hast da auch arg viele Nullbytes in deiner Zahl. Vermutlich ist RAND_MAX bei dir signifikant kleiner als 2^32.



  • Guenther schrieb:

    This decimal constant is unsigned only in ISO C90

    Ganzzahlkonstanten sind per Default signed - versuch's mal mit 4294967295ul

    und was die Zeitgenauigkeit angeht: srand() ruft man nur einmal am Programmanfang auf, danach liefert der Zufallsgenerator eine (pseudo)zufällige Folge von Werten. Wenn du es vor jedem rand() neu aufrufst, wird der Zufallsgenerator immer wieder neu initialisiert (wenn du schnell genug bist, sogar jedes Mal mit dem selben Startwert -> da bekommst du auch jedes Mal die selbe Zufallszahl).



  • net schrieb:

    Guenther schrieb:

    Also ich bekomme mit der Änderung folgende Zufallszahl (HEX)
    7D E7 1D F8 00 00 00 00 F4 D5 00 00 C0 EC D7 BE F4 57 01 00 38 EA 07 00 50 F0 07 00 02 00 00 00 17 D9 4C 59 00 00 00 00 00 00 00 00 68 EC 07 00 E4 EE D7 BE EC EE D7 BE 01 00 00 00 68 EC 07 00

    das ist aber ein klein wenig mehr als 64 bits, 512 oder so 😉

    Äh, Huch! Klar, du hast Recht. Schon schwierig mit den Bits und Bytes. Peinlich 😮

    Also nochmal, das ist also die Ausgaben nach 3 Durchläufen (T>1s)

    7B D6 56 CB 00 35 03 5C,
    29 21 FB 3A 50 50 EF 22,
    57 C9 35 2B 45 EE 0C ED ...

    Die Warnung kommt trotzdem. Gibt es keinen Zufallsgenerator, der direkt 64 oder 128 bit Zufallszahlen erzeugt?

    Wenn diese Warnung noch weggeht bin ich aber trotzdem zufrieden.

    Günther



  • CStoll schrieb:

    und was die Zeitgenauigkeit angeht: srand() ruft man nur einmal am Programmanfang auf, danach liefert der Zufallsgenerator eine (pseudo)zufällige Folge von Werten. Wenn du es vor jedem rand() neu aufrufst, wird der Zufallsgenerator immer wieder neu initialisiert (wenn du schnell genug bist, sogar jedes Mal mit dem selben Startwert -> da bekommst du auch jedes Mal die selbe Zufallszahl).

    Das weiß ich. Ich habe aber zum Testen nur diese Zufallszahl erzeugt als einzige Aufgabe des Programms.

    Die Funktion srand() rufe ich nur einmal auf, aber wenn ich das Programm jedesmal neu starte kommt eben sowas raus.

    Ganzzahlkonstanten sind per Default signed - versuch's mal mit 4294967295ul

    Aha, wieder was gelernt. Ich dachte, wenn ich sage, dass es eine Vorzeichenlose Zahl ist, dann ist das Gesetz (mein Wille und so... :D). Was macht denn das ul? Heißt das nur "Vorzeichenlos"? Woher kriegt man denn solche Informationen? 😕

    Danke, die Warnung ist jetzt fort.

    Günther



  • Guenther schrieb:

    Die Funktion srand() rufe ich nur einmal auf, aber wenn ich das Programm jedesmal neu starte kommt eben sowas raus.

    Wenn du das Programm zehnmal pro Sekunde startest, bleibt dann überhaupt noch Zeit, sich die Ausgaben anzusehen?

    Ganzzahlkonstanten sind per Default signed - versuch's mal mit 4294967295ul

    Aha, wieder was gelernt. Ich dachte, wenn ich sage, dass es eine Vorzeichenlose Zahl ist, dann ist das Gesetz (mein Wille und so... :D).

    Ja, dank impliziter Typumwandlung (und Modulo-Arithmetik) kann der Compiler das auch auswerten. Aber er schenkt dir trotzdem eine Warnung, daß du mit der Konstante den üblichen Bereich für int's überschritten hast.

    Was macht denn das ul? Heißt das nur "Vorzeichenlos"? Woher kriegt man denn solche Informationen? 😕

    Hab ich im Lauf der Zeit mal aufgeschnappt.

    (das u steht für 'unsigned', das l für 'long')



  • CStoll schrieb:

    Wenn du das Programm zehnmal pro Sekunde startest, bleibt dann überhaupt noch Zeit, sich die Ausgaben anzusehen?

    Ja, die Zahl wird in eine Datei geknistert.

    Hab ich im Lauf der Zeit mal aufgeschnappt. (das u steht für 'unsigned', das l für 'long')

    Hm, das habe ich wohl jetzt auch. *schnapp*

    Danke euch allen, ist echt prima, wie hier immer sehr schnell Fragen geklärt werden.

    Günther


Anmelden zum Antworten