Zufall wird nicht größer als 327**
-
multiplikation
-
Du verwendest die Funktion rand() und die gibt definitiv maximal 32767 zurück.
Diese Berechnung:
return (rand() % (b-a+1)) + a;ergibt entsprechend für a = 0 und b = 50000 nicht Werte zwischen 0 und 50000 sondern zwischen 0 und 32767.
eine möglichkeit schrieb:
mulitplikation
Durch Multiplikation zweier rand()-Ergebnisse kannst du dir natürlich größere Zahlen generieren
-
die lösung des problems könnte in etwa so sein:
long rnd(long a,long b) { int SQRandMax=std::sqrt(b-a+1); return (rand() % SQRandMax)*(rand() % SQRandMax) + a; }
-
otze schrieb:
die lösung des problems könnte in etwa so sein:
long rnd(long a,long b) { int SQRandMax=std::sqrt(b-a+1); return (rand() % SQRandMax)*(rand() % SQRandMax) + a; }Das liefert allerdings keine Gleichverteilung. Wie man sofort sieht, liefert das Produkt schon mal keine Primzahlen zwischen SQRandMax und (b-a+1). Mein Vorschlag wäre
long rnd(long a,long b) { return (rand()*(RAND_MAX+1)+rand()) % (b-a+1) + a; }[
-
Multiplikation ist echt ne ... Lösung:
long rnd() { unsigned long l = rand(); unsigned long l2 = rand(); return l << (sizeof(int) / 8) + l2; }oder so ähnlich...
Durch Bit-shifting halt...
-
Shifter schrieb:
Multiplikation ist echt ne ... Lösung:
long rnd() { unsigned long l = rand(); unsigned long l2 = rand(); return l << (sizeof(int) / 8) + l2; }oder so ähnlich...
Durch Bit-shifting halt...
dann verlierst du die 0 und 1
-
Alle zahlen bis 50000 wird er eh nie durch multiplikation erreichen können. Bei Primzahlen wäre das unmöglich.
Addition wäre da besser zwei rand() funktionen die von 0-25000 gehen wären eine bessere Lösung.
-
Das einfachste wäre wohl einen Generator zu verwenden der einen definierten Wertebereich ausspuckt, also z.B. fix 0 - (2^32-1) oder sowas. z.B. den boost::mt19937 aus Boost.Random.
Alles andere wird schnell ein wenig kompliziert wenn das Programm für beliebige Werte von RAND_MAX funktionieren soll.
Der Vorschlag von camper ist gut solange 0 - (RAND_MAX+1)^2-1 als Wertebereich ausreichend ist, und RAND_MAX klein genug ist dass es dabei nicht zu einem Überlauf kommt.
-
Guckt Ihr:
http://www.c-plusplus.net/forum/viewtopic.php?t=39343
http://www.c-plusplus.net/forum/viewtopic.php?t=39344
http://www.c-plusplus.net/forum/viewtopic.php?t=39331
-
und wo genau steht dort irgendetwas hilfreiches zur Frage wie man den Bereich der Zufallszahlen erweitern kann?