zufählige float Zahl generieren
-
Hallo Zusammen!
hab n kleines problem, ich will ein float Zahl zwischen bistimmte Werten zB: -3.3 und 2.134 genereiern.
mit rand() und srand habe ich zwar schön das für ein intger Zahl gemacht wie in mein folgendes Codeint main( int argc, char *argv[]) { int x=0; int a =-9; int b=8; srand(time(NULL)); for(int i=0; i<10;i++){ x=rand()%(b-a); x-=b; cout<< "x="<<x<<endl;} return 0;}kann mir jemand eine Idee geben wie ich es kriegen kann.
Danke im Voraus
Gruß
Stoly
-
Klassischer Dreisatz: Du teilst das Ergebnis von rand() durch RAND_MAX (und zwar eine Fließkommadivision!) und multiplizierst es mit der Größe deines Zielbereichs. Anschließend noch Verschieben und fertig.
-
ich habe es hingekiert aber ist es die beste lösung oder hat man da einen andern Vorschlag?
int main( int argc, char *argv[]) { float x=0.0; float a =-0.67; float b=3.5; srand(time(NULL)); for(int i=0; i<10;i++){ x=((b-a)*((float)rand()/RAND_MAX))+a; cout<< "x="<<x<<endl;} return 0;}
-
das entspricht deinem vorschlag Seppj oder?
-
Du könntest dir noch Boost.Random anschauen. Hat vor allem deutlich bessere Zufallsgeneratoren dabei. Allerdings gibt es auch gleich Hilfsklassen/Funktoren für Bereichsabdeckungen.
Grüssli
-
Ctoly schrieb:
das entspricht deinem vorschlag Seppj oder?
Ja.
Designtipp: Das Problem ist doch optimal geeignet, um die Lösung in Form einer netten kleinen Funktion zu schreiben.
-
Vorsicht. Auf die Art geht die Gleichverteilung verloren - double(rand()) / RAND_MAX wird mehr Zahlen im Bereich [0.99, 1] als im Bereich [0, 0.01] liefern.
Es kommt natürlich auf den Anwendungsfall an, aber in der Regel ist es mathematisch sinnvoller, Zufallszahlen im Bereich [0, 1) zu generieren (Intervall bei 1 offen), indem man rand() / (RAND_MAX + 1.0) benutzt und dann skaliert; so deckt gewissermaßen jede mögliche Zahl einen gleich großen Teil des Intervalls ab. Soll das Intervall am unteren Ende offen sein, (rand() + 1.0) / (RAND_MAX + 1.0).
-
SeppJ schrieb:
Designtipp: Das Problem ist doch optimal geeignet, um die Lösung in Form einer netten kleinen Funktion zu schreiben.
Besser gleich 'ne Klasse - oder. Heißt class Zufall und hatten wir hier im Forum schon mal.
Anwendung:#include "Zufall.h" // siehe <http://www.c-plusplus.net/forum/p1202571#1202571> #include <iostream> int main() { using namespace std; Zufall< double > zufallszahl( -3.3, 2.134 ); for( int i = 0; i < 20; ++i ) cout << zufallszahl() << endl; return 0; }Ausgabe:
1.63949 -1.70436 -1.55876 1.82738 0.649467 0.121291 -3.12422 -1.20902 -0.781833 1.40533 -2.73368 -0.748998 -1.23107 -1.21665 -1.15927 -2.63402 0.547646 2.02986 -0.339724 1.02392Gruß
Werner
-
Werner Salomon schrieb:
Besser gleich 'ne Klasse - oder. Heißt class Zufall und hatten wir
Sorry, C++ ist zwar Objektorientiert aber zum Glück nicht Java. Daher finde ich es stark übertrieben 2 C Funktionen in eine Klasse zu kapseln (und auch noch ne globale Funktion srand mit einer Funktion init_rand zu kapseln).
Ausserdem ist die Klasse enorm unflexibel. Wenn ich ne Zahl zwischen 1 und 2 will, muss ich zunächst ein neues Objekt anlegen und dann dessen op() aufrufen
Das Problem ist ein ganz klarer Fall für eine inline Funktion. (Punkt)
-
Ich finde, dass ein Zufallsgenerator auf jeden Fall ein Objekt ist. Nur ist die gezeigte Implementierung problematisch, da alle Objekt sich einen globalen Zustand teilen, halt den globalen von rand(), das generelle Problem von rand aus <cstdlib>. Ich finde die Klassentemplates aus <random> schon gelungen. Ich versteh nicht wieso hier auch Anfängern die tollsten Zaubereien aus C++11 vorlegt werden, aber kein Schwein erwähnt sowas einfaches wie <random>. "rand() reicht doch hier". Ja vieles aus C "reicht", trotzdem ist alles andere in diesem Forum verpönt.
-
brotbernd schrieb:
Ich finde, dass ein Zufallsgenerator auf jeden Fall ein Objekt ist. Nur ist die gezeigte Implementierung problematisch, da alle Objekt sich einen globalen Zustand teilen, halt den globalen von rand(), das generelle Problem von rand aus <cstdlib>. Ich finde die Klassentemplates aus <random> schon gelungen. Ich versteh nicht wieso hier auch Anfängern die tollsten Zaubereien aus C++11 vorlegt werden, aber kein Schwein erwähnt sowas einfaches wie <random>. "rand() reicht doch hier". Ja vieles aus C "reicht", trotzdem ist alles andere in diesem Forum verpönt.
Das liegt glaube ich da dran, dass keiner hier random benutzt. Jahrelang hat man eben gelernt, dass entweder rand gut genug ist oder dass man sich gleich nach was professionellem umsehen muss. Dann kam tr1 und löste ein Problem, was in der Praxis schon zufriedenstellend gelöst war, denn eine PRNG-Klasse ist wirklich mal eine Klasse die man auch mit grundlegenden Sprachmitteln so schreiben kann, dass man sie immer wieder in verschiedensten Projekten ohne Anpassung benutzen kann. Daher hatten die, bloß Würfelspiele schreiben noch immer ihren rand, der gut genug war und die die gute Zufallszahlen brauchten hatten ihre guten selbstgeschriebenen Klassen. Und tr1 bot bloß mehr von dem was man schon längst hatte, kam dafür aber mit Portierungsproblemen, da nicht jeder Compiler es gleich unterstützte.
Ich denke das wird sich ändern, jetzt wo <random> offizieller Teil des "richtigen" Standards ist.
-
brotbernd schrieb:
... Ich versteh nicht wieso hier auch Anfängern die tollsten Zaubereien aus C++11 vorlegt werden, aber kein Schwein erwähnt sowas einfaches wie <random>. "rand() reicht doch hier". Ja vieles aus C "reicht", trotzdem ist alles andere in diesem Forum verpönt.
Es erwähnt ja auch keiner, dass man jederzeit auch etwas mit native-C problemlos einsetzen kann. Ist angeblich Schnee von gestern oder gehört in die Rubrik 'Steinzeitprogrammierung'. Einsteiger lernen eben die Denkweise von C++ und nichts anderes!
