float zufallszahl (negativer und positiver Bereich)

#1252981
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
#1253132
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.
Gast #1253151
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.
Gast #1253171
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.
Gast #1253176
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..
#1253177
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
Gast #1253186
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.
Gast #1253196
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.
#1254321
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren