[C++] random() liefert scheinbar immer die gleichen Werte !

daemon777

Lt. Commander
Registriert
Dez. 2003
Beiträge
1.371
Hi,
ich habe da ein problem. Und zwar folgendes. Wenn ich random() benutze kommen irgendwie immer die gleichen zahlen. Also wenn ich jetzt zB eine Schleife nehme und die schleife 10 mal durchlaufe und in der schleife steht: "random(3)" dann sieht das Ergebnis ungefähr so aus:
2
0
1
0
2
usw. so weit so gut. Aber dies geschieht bei jedem Aufruf des Programmes. Also werden jedes mal die gleichen "Zufallszahlen" in der gleichen Reihenfolge generiert.
Weiß jemand woran das liegt ? Oder kennt jemand eine Methode mit der dies zu vermeiden ist ?

Danke schon mal.

P.S.: Das Problem ist leider sehr eilig. Ich müsste es bis morgen gebacken kriegen :(
 
das liegt in der natur von random().
probiers mal mit srand(). weiß jetzt die ganzen parameter nicht mehr, musst halt nachgucken :)
 
Auch hinter jeder random-Funktion liegt ein (immer gleicher) Alogrythmus.

Um wirklich Zufällszahlen zu generieren musst du den Zahlengenerator mit einer immer anderen Zahl intitialisieren. Perfekt dazu geeignet ist eine Vareable der Time-Classe, welche dir die Sekunden seit 1.1.1970 liefert -> jede Sekunde neue Zufallszahlen.

Folgender Code währe das:

srand(sek); //Einmal zur Initialisierung wobei sek die oben erwähte Variable ist.
a = rand(x); //Dort wo du die Zufalszahl benötigst, wobei in a die Zahl steht und x die Grenza angibt.

Hoffe das stimmt jetzt alles. Hab das nur schnell aus dem Kopf aufgeschrieben. Falls nicht kanns nicht viel anders sein, einfahc ein wenig durch die Hilfe der IDE suchen...
 
den zufallszahlengenerator als erstes initialisieren, vor beginn irgendwelcher schleifen oder befehle ! (dann klappt's auch mit'm nachbarn :D)
 
#include <time.h>

srand( (unsigned)time( NULL ) ); // Initialisiert den Random-Generator mit der akt. Zeit in Sek

und dann einfach

x = rand();
 
Danke erstmal.
Bis welche Zahl wird denn bei rand() gezogen ? Bzw. wie kriege ich es hin dass nur die zahlen 0 - 2 gezogen werden ?
rand() erwartet keine Parameter so wies aussieht.
 
Du kannst einfach modulo 3 rechnen, dann erhälst du nur Zahlen zwischen 0 und 2. ;)
Für modulo nimmst du das %-Zeichen.
Also in etwa so:
Code:
int i = rand()%2;
 
Hätte ich auch selber drauf kommen können :D
Einfach modulo :)
Ich probier das jetzt erstmal aus.

EDIT: Funktioniert bestens. Danke an alle ;)
 
Zuletzt bearbeitet:
Wenn der Thread schon offen ist, dann stell ich doch auch gleich mal eine kleine frage! :)


So wie es Green Mamba gesagt hat, erhält man ja die zahlen zwischen 0-2. Ich würde aber gerne Zahlen zwischen 10 und 50 oder 3 und 5 ausgegeben bekommen. Wie kann ich das am besten machen?

Danke schon mal
 
Zum Beispiel so:
Code:
int i=random()%41;
liefert Werte zwischen 0 und 40.
Jetzt nach oben shiften:
Code:
i=i+10;
Damit hast du einen Bereich von 10 und 50 abgedeckt. :)
 
Zuletzt bearbeitet:
Green Mamba schrieb:
Zum Beispiel so:
Code:
int i=random()%40;
liefert Werte zwischen 0 und 40.

Müsste es nicht

Code:
int i=random()%[b]41[/b]

sein? Ich persönlich stelle mir das sehr schwer vor, bei MODULO 40 auf einen Rest von 40 zu kommen. Dürfte Komplikationen geben.

Vorher hast Du es ja auch richtig gesagt (MODULO 3) aber auch falsch aufgeschrieben (%2).

Gruß
Morgoth
 
Müsste es theoretisch schon. Also ich würde es einfach mal ausprobieren :D
 
Ach, ihr Krümelkacker, natürlich müsste es 41 sein, hab ich doch auch geschrieben! :daumen:
 
Zuletzt bearbeitet:
Es müsste auch
Code:
 int i = rand()%41;
heißen (glaube ich). Zumindes funktioniert es so bei mir!

Und du darfst halt nicht
Code:
srand( (unsigned)time( NULL ) )
davor vergessen!
 
Also ich hab das so:

Code:
typedef struct _PLAYER{
	int		health;
	int		strength;
	int		exp;
	char 	name;
} PLAYER;

PLAYER play;

srand( (unsigned)time( NULL ) );
	play.health=rand()%50;

aber irgendwie bekomme ich immer 33 als Ergebnis raus. Egal ob ich es neukompiliere oder nicht.
 
Leider habe ich nicht so die große ahnung von c++. :)

Aber ich glaube das es irgendwie an dem play.health liegt. Denn ich habe es eben noch mal getestet und so müsste es eigendlich gehen!
Du kannst es ja mal mit einer "normalen" variable testen und vieleicht findest du dann einen fehler.

PS: was ist play.health? Ist das eine einzige variable, oder eine zusammen gesetzte, oder was ganz anderes? Das würde mich mal interessieren! :)
 
play.health ist die Variable von dem Typdef Struct

typedef struct _PLAYER{
int health;
......
} PLAYER;

PLAYER play; //Hier wird PLAYER in play umgewandelt

play.health[/code]
play.health kommt aus dem Struct. play geht in den struct rein und health wählt dann die int health variable aus.
 
hallo,
ich hab das oben probiert, und es geht.
aber da time() ja nur jede secunde ne zahl generiert, brauche ich microtime.
ich weiß nicht genau wie die funktion heißt, und weiß auch nicht, wo ich nachschauen soll..


kann mir da jemand helfen?
eventuell auch mit quellangabe?
(ich bin nicht lesefaul, weiß aber nicht, wo ich sowas finden soll..)
 
Zurück
Oben