Hackerboard Wiki HaboBlog
Hackerboard bei Facebook Hackerboard bei Google+ Hackerboard bei Twitter

[HaBo]

 
Code Kitchen Allgemeines Coder-Forum rund um das Programmieren eigenständiger, ausführbarer Programme.

unlogisches mit C++

Diskussion: unlogisches mit C++ im Forum Code Kitchen, in der Kategorie Software Home; Anzeige hi leute, habe heute mal eine endtestatsaufgabe programmiert (code siehe weiter unten). dieses teil soll einfach ein 2-dimensionales array ...

Antwort
Alt 17.01.08, 14:29   #1 (permalink)
 
Benutzerbild von _fux_
 
Registriert seit: 13.09.05
_fux_ Leistung: Abacus
Likes: 5
unlogisches mit C++

Anzeige

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ß...
__________________
und?
_fux_ ist offline   Mit Zitat antworten
Alt 17.01.08, 14:36   #2 (permalink)
Senior Member
 
Benutzerbild von lookshe
 
Registriert seit: 10.03.07
lookshe Leistung: 8086
Likes: 19
Standard

Soweit ich mich aus meiner C Zeit noch erinnere musste man den Zufallsgenerator erst noch starten, bevor man rand() gemacht hat.
lookshe ist offline   Mit Zitat antworten
   
HaBOT
 
- Anzeige -

Werbung ist gerade online    
Alt 17.01.08, 20:22   #3 (permalink)
Copykill
Guest
 
Likes:
Standard

srand heißt der befehl dazu
  Mit Zitat antworten
Alt 17.01.08, 20:39   #4 (permalink)
Senior Member
 
Benutzerbild von lookshe
 
Registriert seit: 10.03.07
lookshe Leistung: 8086
Likes: 19
Standard

Ging das nicht auch mit randomize()? Oder bin ich da jetzt bei der falschen Sprache?
lookshe ist offline   Mit Zitat antworten
Alt 17.01.08, 20:46   #5 (permalink)
Themenstarter
 
Benutzerbild von _fux_
 
Registriert seit: 13.09.05
_fux_ Leistung: Abacus
Likes: 5
Standard

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.

Zitat:
(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!
;-)
__________________
und?
_fux_ ist offline   Mit Zitat antworten
Alt 17.01.08, 20:49   #6 (permalink)
Moderator
 
Benutzerbild von Elderan
 
Registriert seit: 30.03.04
Elderan Leistung: 8086
Likes: 14
Standard

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;
Elderan ist offline   Mit Zitat antworten
Alt 17.01.08, 21:01   #7 (permalink)
 
Registriert seit: 23.03.05
xblax Leistung: 8086
Likes: 22
Standard

Zitat:
Original von lookshe
Ging das nicht auch mit randomize()? Oder bin ich da jetzt bei der falschen Sprache?
Afaik ist randomize() für Delphi (Pascal).
xblax ist offline   Mit Zitat antworten
Alt 17.01.08, 21:31   #8 (permalink)
Themenstarter
 
Benutzerbild von _fux_
 
Registriert seit: 13.09.05
_fux_ Leistung: Abacus
Likes: 5
Standard

@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 ;]
__________________
und?
_fux_ ist offline   Mit Zitat antworten
Alt 17.01.08, 21:53   #9 (permalink)
Moderator
 
Benutzerbild von Elderan
 
Registriert seit: 30.03.04
Elderan Leistung: 8086
Likes: 14
Standard

Hallo,
Zitat:
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

Zitat:
aber ist doch schon ein recht merkwürdiger effekt
Nö, eigentlich nicht.
Elderan ist offline   Mit Zitat antworten
Alt 18.01.08, 15:02   #10 (permalink)
Themenstarter
 
Benutzerbild von _fux_
 
Registriert seit: 13.09.05
_fux_ Leistung: Abacus
Likes: 5
Standard

Zitat:
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.
__________________
und?
_fux_ ist offline   Mit Zitat antworten
Antwort
   
- Anzeige -

Werbung ist gerade online    

[HaBo] » Software Home » Code Kitchen » unlogisches mit C++
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
C++: unlogisches Verhalten bei Grundrechenregeln Extinction Code Kitchen 2 07.06.08 19:53


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61