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()); -- Micha 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..... -- Micha 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? -- Micha 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? 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: ...??? 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: 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: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. |