amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > Zufallszahlen in C/C++ [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

09.04.2002, 08:44 Uhr

Solar
Posts: 3680
Nutzer
Jeder Basic- oder Java-Programmierer kennt sie, rnd() oder random() oder wie auch immer sie heißt - die Funktion, bei der man eine (Pseudo) Zufallszahl zwischen 0.0 (inklusive) und 1.0 (exklusive) erhält.

Ich war immer der Meinung, diese Funktion gibt es "überall" - doch als ich versuchte, dies einem Kollegen auf die Schnelle für C/C++ nachzuweisen, stand ich auf dem Schlauch - stdlib.h / rand() liefert einen Integer zwischen 0 und RAND_MAX...

Frage: Gibt es auch in C/C++ (Standard, nicht Hilfsbibliothek!) eine Pseudo-Zufallszahl-Funktion, die einen (gleichverteilten) Wert zwischen 0.0 und 1.0 liefert?

[ - Antworten - Zitieren - Direktlink - ]

09.04.2002, 10:32 Uhr

Micha1701
Posts: 938
Nutzer
Hi!

RAND_MAX ist (glaub ich) immer 65535. Wenn Du also folgende Funktion benutzt, dann geht es doch:

x = rand()/65535;

schon hast Du eine Zahl zwischen 0 und 1....

Um bei jedem Programmstart andere Zufallszahlen zu erhalten (die Funtion rand() berechnet diese nämlich anhand der Funktion srand()) würde ich noch folgendes am Start empfehlen:

srand(VBeamPos());


--
:boing: Micha :boing:

Look at my HP: http://www.lanser-online.de.vu



[ - Antworten - Zitieren - Direktlink - ]

09.04.2002, 12:58 Uhr

thomas
Posts: 7718
Nutzer

@Micha: auf diese Weise bekommst du eine Zufallszahl zwischen 0 und 0.

Richtig muß es lauten: x = ((float)rand()) / ((float)RAND_MAX);

Aber ich glaube nicht, daß das das gesuchte ist. Immerhin sind wir trotzdem noch auf 65535 verschiedene Zahlen beschränkt.

Gruß Thomas

--
Email: thomas-rapp@web.de

Home: home.t-online.de/home/thomas-rapp/


[ - Antworten - Zitieren - Direktlink - ]

09.04.2002, 14:21 Uhr

Micha1701
Posts: 938
Nutzer
Hi!

Immer dieses casten... ;)

Den Wert 65535 kann man in der includedatei ändern. Dort wird der
Wert ja definiert. Kann man beliebig in der Gegend rumverändern...
Max ist wahrscheinlich 32 bit also 4.294.967.296 aber das muß dann wohl auch reichen....

Ansonsten gibts wohl nur zwei: AmiNET oder selbermachen....
Wie wärs denn mit der aktuellen Rasterstrahlenposition durch die Uhrzeit????? aber das ist hier wohl nicht gefragt.....


--
:boing: Micha :boing:

Look at my HP: http://www.lanser-online.de.vu



[ - Antworten - Zitieren - Direktlink - ]

09.04.2002, 18:19 Uhr

thomas
Posts: 7718
Nutzer

@Micha: sag mal, weißt du überhaupt wovon du redest ? Die Funktion rand() wird immer Zufallszahlen zwischen 0 und 65535 liefern. Wenn du durch 4.294.967.296 teilst, bekommst du Zufallszahlen zwischen 0 und 0,0000152587890625, aber immer noch 65536 Stück.

Außderdem war die Frage nach C/C++ Standard (ANSI wahrscheinlich). Da helfen Rasterstrahlpositionen und Aminet und selbermachen wenig.

Gruß Thomas

--
Email: thomas-rapp@web.de

Home: home.t-online.de/home/thomas-rapp/


[ - Antworten - Zitieren - Direktlink - ]

09.04.2002, 19:05 Uhr

Micha1701
Posts: 938
Nutzer
Thomas,

wenn ich in der Includedatei folgendes ändere:

#define RAND_MAX 65535

in

#define RAND_MAX 4294967296

biste Dir trotzdem sicher, daß nur 65535 verschiedene Zahlen rauskommen????

Was für eine hervoragende Idee hast Du denn, Thomas?
--
:boing: Micha :boing:

Look at my HP: http://www.lanser-online.de.vu



[ - Antworten - Zitieren - Direktlink - ]

10.04.2002, 07:48 Uhr

Solar
Posts: 3680
Nutzer
Micha, Micha... Du änderst in limits.h wahrscheinlich auch INT_MAX, um ein 16bit-System zum 32-bit-System zu machen, was? :rolleyes:

Ja es ging um ANSI-C/C++ - ich war einfach überrascht (nach meinen Erfahrungen mit Basic, ARexx und Java) daß hier die Zufallszahlen offensichtlich anders gehandhabt werden...

[ - Antworten - Zitieren - Direktlink - ]

10.04.2002, 19:03 Uhr

Holger
Posts: 8116
Nutzer
Also, auf dem Linux-Rechner den ich jetzt gerade vor meiner Nase habe, betraegt RAND_MAX 2147483647, das sollte fuer float-Werte eine ausreichende Streuung bieten. Wem das nicht reicht, der kann ja noch rand()*RAND_MAX|rand() benutzen.

mfg

--

Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

11.04.2002, 08:26 Uhr

Solar
Posts: 3680
Nutzer
(Hiermit stellen wir zunächst einmal fest: Unter C/C++ sind Zufallszahlen nicht zwischen 0.0 und 1.0, sondern zwischen 0 und RAND_MAX. Alles bleibt anders. Zurück zum Sender.)

Zitat:
Original von Holger:
rand()*RAND_MAX|rand()


...???

Uh...

Und was erreichen wir damit? Bitweises ODER? Irgendwie blick' ich diesen Kunstgriff auf die Schnelle nicht...

[ - Antworten - Zitieren - Direktlink - ]

11.04.2002, 17:47 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Solar:
Und was erreichen wir damit? Bitweises ODER? Irgendwie blick' ich diesen Kunstgriff auf die Schnelle nicht...


Kernpunkt ist, zwei Zufallszahlen zu erzeugen, eine fuer die Highbits und eine fuer die Lowbits. Dann hat man einen groesseren Wertebereich, die tatsaechliche Streuung haengt allerdings auch von der Laenge der produzierten Zahlenreihe ab, das sind aber Details, die IMHO "unter der Haube" stecken und ueber die man nur spekulieren kann (aber nicht sollte). Fuer den Alltags sollte es ausreichen.

mfg

--

Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

12.04.2002, 06:21 Uhr

Solar
Posts: 3680
Nutzer
Öhm, Holger... Dir ist aber bewußt, das schon Dein RAND_MAX ein 32-Bit-Wert ist, und Deine High/Low-Konstruktion einen Überlauf erzeugt?

[ - Antworten - Zitieren - Direktlink - ]

12.04.2002, 15:13 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Solar:
Öhm, Holger... Dir ist aber bewußt, das schon Dein RAND_MAX ein 32-Bit-Wert ist, und Deine High/Low-Konstruktion einen Überlauf erzeugt?

Na na na, wir wollen doch nicht mehr über das jeweilige System annehmen, als wir wirklich wissen. Wenn z.B. RAND_MAX 65535 beträgt, gibt's keinen Überlauf in 32 Bit, wenn dagegen RAND_MAX 2147483647 beträgt, dann ist das Ergebnis schon ein 32Bit-Wert und a) ich brauche nicht mehr Bits oder b) ich rechne mit 64Bit-Integer Werten, ggf mit zusätzlichen cast.
Natürlich ist es nahezu unmöglich, ein allgemein gültiges Statement ohne Fallunterscheidungen zu machen, aber noch wissen wir ja nicht mal, welche Anzahl relevanter Bits Du am Ende für Deinen float zwischen 0 und 1 brauchen wirst. Wahrscheinlich 24, aber das ist das schöne an "Standard"-C: der Programmierer weiß einfach nichts ?( über das System.

mfg

--

Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > Zufallszahlen in C/C++ [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.