Hallo Forum, ich möchte Zufallszahlen im negativen und positiven Bereich als float-Werte erzeugen. Der Benutzer gibt an in welchem Bereich er seine Zufallszahlen haben möchte (z.Bsp.: von -6,3 bis 8,9) und Anzahl der zu erzeugende Zufallszahlen und das Programm gibt ihm abwechselnd einmal negative und einmal positive float-Zufallszahl aus. Mit welcher Funktion kann ich es realisieren? Wie kann ich float-Zufallswerte erzeugen? Das ganze in C oder C++. Vielen Dank cimbom
gibts bei dir sowas wie - rand() - random() Das abwechselnd negative und positive Zahlen herauskommen müssen und die entsprechend skalieren ist dann nur noch + - * und / rechnen.
Gast schrieb: > gibts bei dir sowas wie > - rand() > - random() > > Das abwechselnd negative und positive Zahlen herauskommen müssen und die > entsprechend skalieren ist dann nur noch + - * und / rechnen. ja aber rand() liefer nur integer-Werte, keine float-Zahlan :-(
Naja, Du musst eben daraus floats machen. Eine Division hilft da Wunder. Zwei Integer Zufallszahlen erzeugen und dann durcheinander dividieren. Voilà, eine Fliesskommazahl.
Ahem schrieb: > Naja, Du musst eben daraus floats machen. > Eine Division hilft da Wunder. > > Zwei Integer Zufallszahlen erzeugen und dann durcheinander dividieren. > Voilà, eine Fliesskommazahl. die Idee ist sehr gut ;-) Danke
Ahem schrieb: > Zwei Integer Zufallszahlen erzeugen und dann durcheinander dividieren. > Voilà, eine Fliesskommazahl. Wird dann aber mit dem Bereich etwas mühsam. Ich würde eher erstmal durch einen festen Betrag (z.B. 100) dividieren, damit man einen Float mit zwei Nachkommastellen hat und diesen dann entsprechend skalieren. Allerdings verträgt sich "Abwechselnd +/-" und "zufällig" in meinen Augen nicht so recht, wenn Vorgabe bereits negative und positive Bereiche enthält.
Und dann noch wieder schön die Division durch Null abfangen und die Zahlen wieder zurück in die ursprüngliche Verteilung rechnen ja?! Mann, les mal ein simples C-Buch.
1 | The rand() function shall compute a sequence of pseudo-random integers |
2 | in the range [0, {RAND_MAX}]. |
Und noch viel wichtiger:
1 | The srand() function uses the argument as a seed for a new sequence of |
2 | pseudo-random numbers to be returned by subsequent calls to rand(). If |
3 | srand() is then called with the same seed value, the sequence of |
4 | pseudo-random numbers shall be repeated. If rand() is called before any |
5 | calls to srand() are made, the same sequence shall be generated as when |
6 | srand() is first called with a seed value of 1. |
Also:
1 | #include <stdlib.h> |
2 | |
3 | /* Liefert zufällige Werte im Intervall [0..1] */
|
4 | float zahl() { |
5 | return (float) rand() / (float) RAND_MAX; |
6 | }
|
7 | |
8 | int main() { |
9 | srand(time(NULL)); |
10 | }
|
Die Gebetsmühle von wegen 'muss es wirklich Fließkomma sein' erspare ich mir und dir heute mal -- denk einfach mal drüber nach.
@ Philipp Burch
>Wird dann aber mit dem Bereich etwas mühsam
Da gebe ich Dir recht und es gibt sicherlich auch einiges anderes zu
beachten. Aber ich erwarte das der Fragesteller hier auch selbst einiges
an Gehirnschmalz reinsteckt, anstatt ihm alles vorzukauen.
Ahem schrieb:
> anstatt ihm alles vorzukauen.
Dann kau bitte auch richtig vor.
Man dividiert durch RAND_MAX, wie ich oben beschrieben habe, dann läufts
auf ein Intervall [0..1] raus und alles ist wunderbar..
Ahem schrieb: > @ Philipp Burch > >>Wird dann aber mit dem Bereich etwas mühsam > > Da gebe ich Dir recht und es gibt sicherlich auch einiges anderes zu > beachten. Aber ich erwarte das der Fragesteller hier auch selbst einiges > an Gehirnschmalz reinsteckt, anstatt ihm alles vorzukauen. Richtig :-D
Bevor man mach zufallszahlen schreit sollte man sich im klaren sein, wie die denn verteilt sein sollen. Es gibt verschiedene Standards. Die eine ist eine Unsigned16bit, eine andere macht Signed_16bit, was eigentlich dasselbe ist, und dann gibt es noch 16bit fractional, dh eine 16bit Zahl zwischen 0 und 1. diese kriegt man im wesentlichen indem man die Unsigned16bit durch 65536 dividiert, dh eigentlich nichts damit macht. Sobald man 2 solche Zahlen durcheinander dividiert, verschiebt man die Verteilung.
pfft... schrieb: > Sobald man 2 solche Zahlen durcheinander dividiert, verschiebt man die > Verteilung. Ganz genau. Allerdings ist die Funktion 'rand()' im C-Standard präzise definiert, was den Wertebereich angeht, da kann nix schiefgehen. Zitat:
1 | 7.20.2 Pseudo-random sequence generation functions |
2 | 7.20.2.1 The rand function |
3 | Synopsis |
4 | #include <stdlib.h> |
5 | int rand(void); |
6 | Description |
7 | The rand function computes a sequence of pseudo-random integers in the range 0 to |
8 | RAND_MAX. |
9 | The implementation shall behave as if no library function calls the rand function. |
10 | Returns |
11 | The rand function returns a pseudo-random integer. |
12 | Environmental limits |
13 | The value of the RAND_MAX macro shall be at least 32767. |
Sauber und ohne eigene Fehler geht es mit Boost: http://www.boost.org/doc/libs/1_39_0/libs/random/index.html Natürlich nur in C++...
Das ist aber mit Spatzen auf Kanonen, oder? grins
Hm, finde ich gar nicht. Jedenfalls besser, als sich mit rand() irgendwas Unsinniges hinzumurksen. Davon abgesehen, daß man erstmal verstehen muss, wie man es mit boost macht, ist es doch gar nicht ineffizient: ein paar (vermutlich inline-generierte) Template-Funktionen, und gut.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.