unlogisches mit C++

hi leute,

habe heute mal eine endtestatsaufgabe programmiert (code siehe weiter unten).
dieses teil soll einfach ein 2-dimensionales array mit zufallszahlen füllen für den bereich von 0 - n (n gibt man per eingabe vor)

wenn man denn code genauso kopiert und ausführt, werden immer die gleichen Zahlen ausgeben - jedoch nur, wenn man auswählt "ausführen OHNE debuggen". startet man den prozedurschritt debugger, dann funktioniert das programm.

habe es unter folgenden entwicklungsumgebungen getestet:
Dev-C++ (neuste version) und Visual Studio 2005.
hier der code zum ausprobieren:
Code:
#include <iostream>
#include <time.h>

using namespace std;

int main ()
{
	char Abbruch = 'j';
	int Zahlenbereich;
	int Matrix [3][3];
	int i=0;
	int j=0;
	int zahl;
	int msumme=0;

	do 
	{



		cout << "Bereich der Zufallszahlen: ";
		cin >> Zahlenbereich;
		while(i<3)
		{		
			do
			{

				srand ((unsigned int) time(NULL));
				zahl = (rand()%Zahlenbereich) + 1;
				Matrix [i][j]=zahl;
				j++;
			}
			while (j<3);
			i++;
			j=0;		
		}
		i=0;
		j=0;
		// ausgeben
		while(i<3)
		{		
			do
			{
				cout << Matrix [i][j] << " ";
				j++;
			}
			while (j<3);

			i++;
			j=0;
			cout << endl;
		}




	}
	while (Abbruch!='j');


	return 0;
}

lösung des problems:
der code in zeile 28
Code:
	srand ((unsigned int) time(NULL));
einfach unter das erste do schreiben, dann klappts auch ohne debugger ;)
viel spaß...
 
Soweit ich mich aus meiner C Zeit noch erinnere musste man den Zufallsgenerator erst noch starten, bevor man rand() gemacht hat.
 
schaut euch zeilen 27 - 29 etwa an.
da benutze ich srand und danach erst rand.
d.h. es müsste also funktionieren!

dieses programm soll Zufallswerte in alle elemente des 2-dimensionalen arrays speichern und anschließend ausgeben.

(heb ich mal extra hervor)
das programm FUNKTIONIERT, ABER das KURIOSE ist:

wenn ich das programm builde und anschließend einfach laufen lasse, sind alle elemente jeweils immer die SELBE zahl.

wenn ich das programm aber mit debuggen (prozedur- oder einzelschritt, ist egal) ausführe, dann FUNKTIONIERT es, jedes element ist eine andere zahl!

;-)
 
Hallo,
ich weiß nicht was du daran unlogisch findest... Evt. ist dir noch nicht bewusst dass dein Rechner eine Rechenmaschine ist und dementsprechend auch nur Rechnen kann.

Code:
do
			{

				srand ((unsigned int) time(NULL));
				zahl = (rand()%Zahlenbereich) + 1;
				Matrix [i][j]=zahl;
				j++;
			}
			while (j<3);
Das kann so eigentlich kaum funktionieren.
Diese Schleife wird in 0,0000000000000000000001 Sekunden durchlaufen, bis dahin hat sich an time() nicht geändert. D.h., dein Zufallsgenerator wird immer mit dem gleichen Wert initialisiert und liefert somit immer die gleichen Zufallszahlen.

Bei Zufallsgenatoren macht man es so, dass man diese einmal initialisiert und dann fortlaufend auf rand() zugreift.
Denn deine Lösung wäre äquivalent mit:
zahl = ( ((unsigned int) time(NULL))%Zahlenbereich) + 1;
 
@eldaran:

ne unlogisch klingt das jetzt nicht gerade!
deswegen scheints mim debugger eben zu klappen, weil meine machine dann einfach mehr zeit hat ;)

aber noch ne frage:
bedeutet time(NULL) nicht, das er einfach bei 0 anfangen soll.
d.h. wenn ich time(20) eingebe fängt der bei 20 an.

jemand hatte mir erklärt, das das keine echte zufallszahlen sind, sondern seeds. wahrsch. hängt das dann damit zusammen.

aber ist doch schon ein recht merkwürdiger effekt, wenn man halt bedenkt das es mim debugger einwandtfrei läuft.....normalerweise sollte der dann auch in kürzester zeit doch die zahlen ändern?
naja is ja auch egal, muss man halt aufpassen ;]
 
Hallo,
The function time() returns the current time, or -1 if there is an error. If the argument 'time' is given, then the current time is stored in 'time'.

Quelle

Beim Debbuger kann es schon mal mehrere Sekunden dauern, bis du zum nächsten Schritt kommst, womit dann time() auch etwas anderes zurück gibt.
Deine CPU ist aber mittlerweile so schnell, dass diese die Schleife so schnell abarbeitet, dass sich der Wert den time() zurückgibt nicht ändert, da diese nur eine endliche Genauigkeit hat => gleicher Startwert (time() hat sich nicht geändert) => gleiche (Pseudo)Zufallszahlen

aber ist doch schon ein recht merkwürdiger effekt
Nö, eigentlich nicht.
 
Nö, eigentlich nicht.

dooooooooooooch, issser!!!! ;P

ne quatsch. also das mit dem time ist schon klar,aber wenn man das zum erstenmal sieht denkt man im ersten moment ned an time, im 2ten ists mir aber dennoch schon aufgefallen irgendwie ;-)

naja ich denke das kann man schon so als info lassen für anfänger.
 
Zurück
Oben