Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Zufallsgenerator

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ] [ 3 ]
000
06.01.2007, 19:08 Uhr
~meister_racer
Gast


Hallo,

Die Zufalls Funktion rand() ermittelt ja ne Zahl von 0- ca 34000.

Möchte jetzt aber ne Zufallszahl von 0-10 haben. Muss ich den Zufallsgenerator dann immer wieder aufrufen, bis er dann eine Zahl zwischen 0-10 gefunden hat? Das könnte doch dann evtl. ziemlich lange dauern oder?


Andere Frage: Die rand() Funktion ist doch in der Header Datei stdlib.h? Kann ich diese Funktion auch verwenden, wenn ich mit QT Programmiere?

MfG: Meister_Racer
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
06.01.2007, 19:17 Uhr
Suba Esel



Hi,
was schreibst du? C oder C++?
Bei C++ ist rand() auf jeden Fall in iostream, cstdlib und stdlib.h drin, stdlib.h sollte man aber besser nicht benutzen (glaube ich). Ob das bei QT funktioniert, weiß ich nicht.

Du erhältst eine Zahl zwischen 0 und 10 kannst du rand()%10 benutzen.
--
Simon
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
06.01.2007, 20:06 Uhr
0xdeadbeef
Gott
(Operator)


In dem einfachen Fall, in C:

C++:
#include <stdio.h>  // printf
#include <stdlib.h> // srand, rand
#include <time.h>   // time

int main(void) {
  srand(time(0)); // RNG initialisieren

  printf("%d\n", rand() % 11);

  return 0;
}


Bzw. in C++

C++:
#include <cstdlib>
#include <ctime>
#include <iostream>

int main() {
  std::srand(std::time(0));

  std::cout << std::rand() % 11 << std::endl;
}


Für komplexere Anwendungen, z.B. verschiedene Verteilungskurven oder zufällige Fließkommazahlen, gibts z.B. boost.random, zu finden auf www.boost.org - das ist in der Anwendung dann aber auch komplexer.

stdlib.h gibt es in C++ nicht, viele Compiler akzeptieren es trotzdem, weil sie gleichzeitig auch C übersetzen können. Nichtsdestoweniger ist das Mischen der C-header mit C++-Code mindestens unschön.

Übrigens, rand() erstellt Zufallswerte zwischen 0 und RAND_MAX. RAND_MAX ist in stdlib.h definiert, und liegt auf heutigen Maschinen in aller Regel bei INT_MAX, bzw. 2 Milliarden und ein bisschen.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 06.01.2007 um 20:13 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
07.01.2007, 04:22 Uhr
~MartinF
Gast


Hallo zusammen,

ich zitiere einen Auszug aus den Man-Pages:


Zitat:

In Numerical Recipes in C: The Art of Scientific Computing
(William H. Press, Brian P. Flannery, Saul A. Teukolsky,
William T. Vetterling; New York: Cambridge University Press,
1992 (2nd ed., p. 277)), the following comments are made:
"If you want to generate a random integer between 1 and
10, you should always do it by using high-order bits, as
in

j=1+(int) (10.0*rand()/(RAND_MAX+1.0));

and never by anything resembling

j=1+(rand() % 10);

(which uses lower-order bits)."



Grüße
Martin
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
07.01.2007, 11:08 Uhr
Suba Esel



@ 0xdeadbeef:

Zitat:

Bzw. in C++


C++:
#include <cstdlib>
#include <ctime>
#include <iostream>

int main() {
  std::srand(std::time(0));

  std::cout << std::rand() % 11 << std::endl;
}





Srand, rand und time() werden bereits in iostream definiert, du musst cstdlib und ctime nicht mit einbinden

Sowohl srand, rand und time benötigen kein std::

Hast Recht, es muss natürlich rand()%11 sein

Außerdem:

Zitat:

Übrigens, rand() erstellt Zufallswerte zwischen 0 und RAND_MAX. RAND_MAX ist in stdlib.h definiert, und liegt auf heutigen Maschinen in aller Regel bei INT_MAX, bzw. 2 Milliarden und ein bisschen.



RAND_MAX liegt bei mir bei 32767.

@ MartinF:
rand()%11 ist die allereinfachste Version einer Pseudo-zufallszahl, die leider dafür sorgt, dass die Zahlen nicht ganz gleichmäßig verteilt sind.
rand() rechnet einfach eine Zahl zwischen (bei mir) 0 und 32767 aus. Um nun auf kleinere Zahlen zu kommen, benutzt man den Modulo - Operator (%), der dir den Rest einer Gleichung zurückgibt. 20%6 ergibt 2, weil 20/6 3 Rest 2 ergibt.
Der Rest einer Division muss natürlich kleiner sein als der Nenner, deshalb rand()%11.
ABER: Der Rest kann auch 0 sein!
Warum dann einige Zahlen häufiger drankommen als andere, hat mir noch nie eingeleuchtet, ist aber so.
--
Simon

Dieser Post wurde am 07.01.2007 um 11:13 Uhr von Suba Esel editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
07.01.2007, 12:17 Uhr
FloSoft
Medialer Over-Flow
(Administrator)



Zitat von Suba Esel:
@ 0xdeadbeef:

Srand, rand und time() werden bereits in iostream definiert, du musst cstdlib und ctime nicht mit einbinden

Sowohl srand, rand und time benötigen kein std::


falsch, wenn du "cstdlib" benutzt, ist rand und srand im namespace std. ansonsten

time ist in "ctime" definiert (auch in namespace std).

Wenn bei dir der Compiler in deiner iostream cstdlib und ctime einbindet, dann ist das etwas merkwürdig. (auch das niedrige RAND_MAX ist etwas komisch, was hast du fürn alten Compiler ?!?)
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
07.01.2007, 12:33 Uhr
Suba Esel



ich nehm Code::Blocks mit MinGW, runtergeladen hier

Ich weiß nicht, ob iostream cstdlib und ctime mit einbindet, auf jeden Fall funktioniert folgendes Programm tadellos:


C++:
#include <iostream>

int main()
{
    srand(time(0));
    std::cout << rand()%10 << std::endl << RAND_MAX;
    std::cin.get();
}



Ausgabe:


Zitat:

6 // z.B.
32676
// Pause
Press ENTER to continue. // kommt vom Compiler (oder IDE?)


--
Simon

Dieser Post wurde am 07.01.2007 um 12:39 Uhr von Suba Esel editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
07.01.2007, 12:39 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


code-blocks ist so ne sache, bei dem kann man nicht mal auf mit -pedantic kompilieren ohne warnungen in den systemheadern zu kriegen ...
--
class God : public ChuckNorris { };

Dieser Post wurde am 07.01.2007 um 13:53 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
07.01.2007, 12:40 Uhr
Suba Esel



-pedantic? und ich war noch am editieren^^
--
Simon
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
07.01.2007, 12:42 Uhr
Suba Esel



Ich lern C++ in ner AG inner Schule (geht morgen wieder los )
Auf den Schul - PCs ist überall wenn überhaupt Code::Blocks drauf

Was würdest du denn empfehlen (KOSTENLOS, wohlgemerkt?^^)
--
Simon

Dieser Post wurde am 07.01.2007 um 12:43 Uhr von Suba Esel editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ] [ 3 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: