zufalls zahlen mit rand() da random() nicht geht

alixander

Mitglied
hallo Leute!
Ich bin bei dem Versuch zufallszahlen zu erstellen auf ein Problem gestoßen- also erst mal früher als ich immer solche "DosBox" Programme geschrieben hab (damals hatte ich auch BCB 1) , hab ich meine Zufallszahlen immer so erstellt:
Mit Randomize() vorbereitet und dann mit random(zahl) erstellt.
Nun Arbeite ich mit Visual C++ 6 Autorenversion und mach grad ein DirectX Programm, bei dem ich nun auch Zufallszahlen brauche- nur hier geht diese Metode nicht- ich hab schon alle möglichen header inkludiert aber es ging trozdem nicht-
NUn hab ich im Internet irgentwas von rand() und srand() gelesen , aber das hab ich nciht ganz verstanden. Also wenn mir jemand helfen kann , ich möchte zwei Zufallszahlen erstellen eine zwischen 0 und775 und eine zwischen 0 und 575. Danke schon mal im Vorraus für eure Hilfe - msg alixander
 
Hi,

rand() (stdlib) erzeugt Zufallszahlen von 0 bis RAND_MAX (0x7fff). Mit srand(unsigned int seed) wird der Zufallsgenerator inititlisiert (ein Timer-Wert bietet sich hierfür an).
So wie ich das sehe, wirst Du, um Zufallszahlen in einem bestimmten Bereich zu erhalten, nicht um eine Integer-Division herumkommen (int number = rand() * (my_max / RAND_MAX) ). Ich bin allerdings auch noch nicht besonders in der Materie (VC++) bewandert, von daher kennt vielleicht jemand eine viel elegantere Methode.

Gruß
 
Code:
#include <windows.h>

int ZufallsGenerator(int max)
{
	return (rand() * GetTickCount() % max + 1);
}
 
Code:
return (rand() * GetTickCount() % max + 1);
Das rand() sollte eigentlich vollkommen ausreichen, wenn der Generator bei Programmstart mit z.B. srand( GetTickCount() ) initialisiert wurde.

(Ich kann mir vorstellen, dass durch die Multiplikation mit GetTickCount() eine merkwürdige Verteilung rauskommt.)

PS: Man muss dem Zufallszahlengenerator einen (immer anderen) Startwert (Samen bzw. Seed) geben (z.B. mit GetTickCount()), da ansonsten immer die selbe Zahlenfolge erzeugt wird. Immerhin handelt es sich ja um Pseudozufallszahlengeneratoren.
 
Zuletzt bearbeitet:
Das (die Wiederholbarkeit der Zahlenfolgen) ist aber z.B. für Simulationen eine gewünschte Eigenschaft, da sie die Wiederholbarkeit des Experiments sicherstellt.
 
Original geschrieben von Kachelator
(Ich kann mir vorstellen, dass durch die Multiplikation mit GetTickCount() eine merkwürdige Verteilung rauskommt.)

so soll das ja auch sein, oder nicht? wenn du nur rand() verwendest... kommt eine einzige zufallszahl beim programmstart raus, die ändert sich nicht... und mit srand hat bei mir früher auch nicht gefuzzt... :/

ich find das is ne einfache lösung, da brauch man nicht viel rum zu machen :)

gruß
 
allerdings erwatet man, dass die Zufallszahlen gleichverteilt sind. Sonst würfelt der Würfel auf einmal z.B. mehr 5er als 1er und das wäre schlecht.
 
@Rook: Die Verteilung sollte gleichmässig sein (auch LaPlace-Verteilung genannt). Bei der GetTickCount-Methode werden die Resultate im Schnitt immer grösser, je länger der Rechner läuft. Nach etwa 40 Tagen ununterbrochenen Laufens (unter Windows unwahrscheinlich :) ) erreichen sie ein Maximum, kurz bevor GetTickCount() dann den Wertebereich einmal durchlaufen hat. Danach geht es wieder mit (tendenziell) kleinen Zahlen los. Das ist keine gute Verteilung.
 
das stimmt jetzt wegen des % Operators nicht wirklich, aber die Gleichverteilungsannahme müßte trotzdem erst einmal überprüft werden.
 
Original geschrieben von squeaker
das stimmt jetzt wegen des % Operators nicht wirklich
Okay, bei sehr kleinen max -Werten kann man es vielleicht vernachlässigen, aber warum überhaupt den ganzen Aufwand treiben, wenn ein srand() mit GetTickCount() zu Beginn der Anwendung genügt? Abgesehen von der Verteilung, meine ich.
 
Zurück