zufalls zahlen mit rand in einem bereich von-bis größer als rand_max
-
hallo,
kann ich mit rand() zufallszahlen erzeugen die einem bereich
von - bis liegen und auch größer sein können als RAND_MAX?ich habe mir mal ein kleine unterfunktion geschrieben welche zahlen
in einem bereich von - bis zurück liefert, aber was passiert wenn die
zahl bis größer als RAND_MAX ist?int zufall( int von, int bis) { return rand()%(bis-von+1)+von; }
-
http://www.c-plusplus.net/forum/viewtopic-var-t-is-130107-and-highlight-is-zufallszahl.html
Du könnetst zwei Zufallszahlen generieren, die in einem Intervall von 0 bis RAND_MAX liegen. Die Summe wäre dann im Intervall von 0 bis 2*RAND_MAX.
-
-
ich habe mal folgendes irgendwo gelesen:
long zufall( long von, long bis) { return( von + (bis-von+1) * rand() / (RAND_MAX+1) ); }
kommen aber leider auch nur zahlen bis maximal 65529 raus, ich
brauche aber einen zahlenbereich der von bis plus minus 1000000 geht.eigentlich brauche ich im negativem bereich nur zahlen bis ca. -10000
aber im positivem bereich müssen diese genau zwischen 1 und 1000000 liegen.und wenn ich jetzt eure antworten lese, müsste ich rand() insgesamt
1000000 / RAND_MAX aufrufen und diese zahlen dann addieren ???RAND_MAX liegt irgendwo bei 32000, würde bedeuten 32*rand ???
-
rand() erzeugt eine 15 Bit lange Zufallszahl.
Du brauchst aber
1.000.000 - (-10.000) = 1.010.000
Werte, und das passt natürlich nur in 20 Bit.
So generierst Du (sinngemäß) eine 20 Bit lange Zufallszahl aus rand():
unsigned long rnd; rnd = (rand() & 0x1F) + (rand() << 5);
Einfach zweimal ziehen, vom einen Ergebnis nur die unteren 5 Bit nehmen, und dann das andere Ergebnis um 5 Bit nach links shiften. Resultat: 20 Bits Zufall.
Diesen Wert kannst Du nun mittels Modulo und durch Subtraktion auf Dein Intervall anpassen.
-
selbst wenn du den rand() bereich auf 1000000 aufblaest, hast du immernoch maximal MAX_RAND verschiedene zahlen.
ich bastel mal was, unter der annahme RANX_MAX == 32767 und unsigned int hat 32 bit.int randrange(int min, int max) { unsigned int R = (rand() << 0) | (rand() << 15) | ((rand() & 0x03) << 30); return min + R % (max-min+1); }
sollte einen groesseren bereich abdecken koennen.
-
vielen dank für eure schnellen und freundlichen antworten
ich brauchte das ganze für eine datenbank anwendung,
bin nun endlich zu hause angekommen und konnte in einem
meiner bücher nachschlagen, am besten hat mir gefallen:http://www.c-plusplus.net/forum/viewtopic-var-p-is-953320.html#953320
sorry, aber so ist es wohl halt im lernprozess
-
Vielleicht wäre es hier eine gute Idee das rand() aus der stdlib.h links liegen zu lassen und sich sein eigenes random() zu basteln. Hier kannst dir was raussuchen.
-
TactX schrieb:
Vielleicht wäre es hier eine gute Idee das rand() aus der stdlib.h links liegen zu lassen und sich sein eigenes random() zu basteln.
Halte ich für so eine Anforderung für (noch) nicht notwendig. Wenn es um Verteilungen und mathematische Tests geht sicherlich, aber nur weil die Zahl größer als RAND_MAX sein muß braucht man nicht gleich so tief in den Werkzeugkasten zu greifen.
Denn wenn man selbst einen Zufallszahlengenerator bastelt, muß man diesen auch mal testen - denn den Vorteil hat der rand() aus stdlib, er ist hinreichend zufällig und funktioniert auch.