Forum: PC-Programmierung float zufallszahl (negativer und positiver Bereich)


von Cimbom G. (cimbomgs)


Lesenswert?

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

von Gast (Gast)


Lesenswert?

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.

von Cimbom G. (cimbomgs)


Lesenswert?

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 :-(

von Ahem (Gast)


Lesenswert?

Naja, Du musst eben daraus floats machen.
Eine Division hilft da Wunder.

Zwei Integer Zufallszahlen erzeugen und dann durcheinander dividieren. 
Voilà, eine Fliesskommazahl.

von Cimbom G. (cimbomgs)


Lesenswert?

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

von Philipp B. (philipp_burch)


Lesenswert?

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.

von Sven P. (Gast)


Lesenswert?

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.

von Ahem (Gast)


Lesenswert?

@ 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.

von Sven P. (Gast)


Lesenswert?

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..

von Cimbom G. (cimbomgs)


Lesenswert?

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

von pfft... (Gast)


Lesenswert?

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.

von Sven P. (Gast)


Lesenswert?

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.

von Klaus W. (mfgkw)


Lesenswert?

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++...

von Sven P. (Gast)


Lesenswert?

Das ist aber mit Spatzen auf Kanonen, oder? grins

von Klaus W. (mfgkw)


Lesenswert?

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
Noch kein Account? Hier anmelden.