mikrocontroller.net

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


Autor: Cimbom Gs (cimbomgs)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Cimbom Gs (cimbomgs)
Datum:

Bewertung
0 lesenswert
nicht 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 :-(

Autor: Ahem (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, Du musst eben daraus floats machen.
Eine Division hilft da Wunder.

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

Autor: Cimbom Gs (cimbomgs)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Philipp Burch (philipp_burch)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.
The  rand() function shall compute a sequence of pseudo-random integers
in the range [0, {RAND_MAX}].

Und noch viel wichtiger:
The  srand() function uses the argument as a seed for a new sequence of
pseudo-random numbers to be returned by subsequent calls to rand().  If
srand()  is  then  called  with  the  same  seed value, the sequence of
pseudo-random numbers shall be repeated. If rand() is called before any
calls to srand() are made, the same sequence shall be generated as when
srand() is first called with a seed value of 1.

Also:
#include <stdlib.h>

/* Liefert zufällige Werte im Intervall [0..1] */
float zahl() {
  return (float) rand() / (float) RAND_MAX;
}

int main() {
  srand(time(NULL));
}


Die Gebetsmühle von wegen 'muss es wirklich Fließkomma sein' erspare ich 
mir und dir heute mal -- denk einfach mal drüber nach.

Autor: Ahem (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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..

Autor: Cimbom Gs (cimbomgs)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: pfft... (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
7.20.2 Pseudo-random sequence generation functions
7.20.2.1 The rand function
Synopsis
       #include <stdlib.h>
       int rand(void);
Description
The rand function computes a sequence of pseudo-random integers in the range 0 to
RAND_MAX.
The implementation shall behave as if no library function calls the rand function.
Returns
The rand function returns a pseudo-random integer.
Environmental limits
The value of the RAND_MAX macro shall be at least 32767.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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++...

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist aber mit Spatzen auf Kanonen, oder? grins

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.