Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

babelfish

Alter Hase

Beiträge: 1 222

Wohnort: Schweiz

Beruf: Informatiker

  • Private Nachricht senden

11

18.03.2009, 23:03

Ich nutz dazu immer "srand (timeGetTime ());" und binde die winmm.lib ein. Kommt aber wahrscheinlich aufs selbe hinaus.

Vielleicht hast du es bereits durch eine andere Datei eingebunden (windows.h oder ähnliches).

Gotbread

Alter Hase

Beiträge: 421

Beruf: Student (Etechnik) + Hiwi

  • Private Nachricht senden

12

19.03.2009, 00:10

windows.h:

srand(GetTickCount()); :D

kannst du auch mehrmals pro sekunde nehmen.
Mfg Goti
www.gotbread.bplaced.net
viele tolle spiele kostenlos, viele hardware-basteleien :)

"Es ist nicht undicht, es läuft über" - Homer Simpson

13

19.03.2009, 08:30

Zitat von »"babelfish"«

Ich nutz dazu immer "srand (timeGetTime ());" und binde die winmm.lib ein. Kommt aber wahrscheinlich aufs selbe hinaus.

Vielleicht hast du es bereits durch eine andere Datei eingebunden (windows.h oder ähnliches).


Ne, hab ich nicht, das ist ja das komische..
Benutze den GCC. Also ich habe nur iostream und zwei dateien von mir selbst eingebunden, ansonsten gar nichts. Weiß jemand, wieso srand() und rand() trotzdem funktioniert? Geht das bei euch auch?^^

xardias

Community-Fossil

Beiträge: 2 731

Wohnort: Santa Clara, CA

Beruf: Software Engineer

  • Private Nachricht senden

14

19.03.2009, 09:26

Vielleicht mal zur Erklärung der Sache mir rand/srand:

Computer können ja bekanntlich keine echten Zufallszahlen berechnen (Bzw nicht ohne externe Hilfe). Daher verwendet man einen PRNG (Pseudo Random Number Generator).
Die Zahlen die von dem Algorithmus ausgespuckt werden sind keinesfalls zufällig, jedoch haben sie eine ähnliche Verteilung wie echte Zufallszahlen.

Der Algorithmus braucht eine Art Startwert (seed genannt) den man mit srand setzen kann. Daraus werden alle folgenden Zufallswerte berechnet (rand).
Da der Algorithmus wie gesagt absolut nichts zufälliges an sich hat, bekommt man natürlich auch die selben Zufallszahlen wenn man das selbe srand verwendet.

Daher ist es üblich den Seed zu Beginn des Programms auf etwas möglichst zufälliges zu setzen, was sich nicht so schnell wiederholt: Die aktuelle Zeit - srand(time(NULL));.
Manche Anwendungen benutzen z.B. auch die Prozess ID als Seed.

Wenn du nicht gerade sicherheitsrelevante Sachen machst (Generieren von Schlüsseln, etc) ist es meist völlig ausreichend das nur ein einziges malm zu Programmstart zu machen.
rand wird dir immer weiter brav neue Zufallszahlen liefern, auch ohne alle paar Zahlen einen neuen Seed zu bekommen.

Peppie

Frischling

Beiträge: 18

Wohnort: Mainz!

Beruf: FIAE

  • Private Nachricht senden

15

19.03.2009, 09:34

oder versuchst es mal so:

C-/C++-Quelltext

1
2
3
4
5
for( int i=0; i<10000; i++ )
{
    srand( time(NULL) * i );
    cout << rand() << endl;
}


So hast du bei jedem rand einen neuen Seed-Wert 8) Damit will ich dir nur zeigen das du evtl. die Zählervariable mit in den Seed bringen solltest, ob du das jetzt mit time() oder GetTickCount oder what ever machst, is hier dir überlassen

16

19.03.2009, 09:51

@xardias
gute Zusammenfassung, danke

@ peppie
Auch eine Idee, aber wenn ich srand() jetzt wirklich nur ein einziges mal aufrufe, also am Programmstart klappt es auch.

Was ich immer noch nicht verstehe: Warum muss man time.h nicht einbinden? Hat das mal jemand versucht, srand() und rand() zu benutzen, ohne time.h oder sonst eine Bibliothek zu includen?

xardias

Community-Fossil

Beiträge: 2 731

Wohnort: Santa Clara, CA

Beruf: Software Engineer

  • Private Nachricht senden

17

19.03.2009, 10:36

rand/srand sind Teil der C Standardbibliothek wenn mich nicht alles täuscht. Definiert wird das ganze in <cstdlib> (oder <stdlib.h> in C).

time.h brauchst du nur wenn du auch time() für den seed verwenden willst.

18

19.03.2009, 10:45

Zitat von »"xardias"«

rand/srand sind Teil der C Standardbibliothek wenn mich nicht alles täuscht. Definiert wird das ganze in <cstdlib> (oder <stdlib.h> in C).

time.h brauchst du nur wenn du auch time() für den seed verwenden willst.

Das tue ich ja. Ich benutze srand(time(NULL)) und dann ganz normal rand(). Und ich binde weder time.h noch stdlib.h noch sonst etwas in der Art ein..
Und trotzdem funktioniert es einwandfrei :?

Kann das jemand erklären oder auch mal ausprobieren :)

xardias

Community-Fossil

Beiträge: 2 731

Wohnort: Santa Clara, CA

Beruf: Software Engineer

  • Private Nachricht senden

19

19.03.2009, 10:50

Was für Includedateien hast du denn sonst so eingebunden? Ich würde vermuten, dass eine der anderen Include Dateien die du benutzt selbst time.h oder stdlib.h eingebunden haben.
Dann hast du die Dateien indirekt ebenfalls eingebunden.

20

19.03.2009, 11:16

Also, ich habe iostream eingebunden. Außerdem noch zwei selbsterstellte Header mit zugehörigen .cpp Dateien. In keiner dieser Dateien ist aber außer iostream sonst noch etwas eingebunden.

Und "using namespace std;" hab ich noch angegeben, hat aber damit glaub ich nix zu tun.

Sonst hab ich wirklich gar nix! Klappt es bei dir/euch denn nicht, srand(time(NULL)) und rand() zu benutzen, ohne time.h oder stdlib.h oder so zu includen?

Werbeanzeige