myGully.com Boerse.SH - BOERSE.AM - BOERSE.IO - BOERSE.IM Boerse.BZ .TO Nachfolger
Zurück   myGully.com > Computer & Technik > Programmierung
Seite neu laden

Zufallszahlengenerator

Willkommen

myGully

Links

Forum

 
Antwort
 
Themen-Optionen Ansicht
Ungelesen 07.01.14, 11:00   #1
Neo Larson
Anfänger
 
Registriert seit: May 2010
Beiträge: 37
Bedankt: 0
Neo Larson ist noch neu hier! | 0 Respekt Punkte
Standard For-Schleife

Hi.

Nach langer und harter Recherche und Programmierung, hab ich nun ein Programm geschrieben, dass zwei Zufallszahlen generiert und diese vergleicht. Das macht das Programm nun solange, bis die generierten Ziffern übereinstimmen. Funzt.

So.

Nun soll das ganze mit einem anderen Programm ausgeführt werden, wo zusätzlich eine Laufvariable hinzukommt, die den Test so oft wiederholt, wie die Laufvariable sagt (meinet wegen fünf mal). Das sollte ja mit einer for-Schleife gehen.
Beim ersten Durchlauf stimmt es auch, nur bei allen danach kommen falsche Werte raus.

Hier der Code:

Code:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int mehrfacher_test(void)
{
	int anzahl_tests;
	printf("Wie viel Tests sollen durchgefuehrt werden? ");
	scanf("%d", &anzahl_tests);
	int zaehler, versuche;
	for(zaehler=1; zaehler<=anzahl_tests; zaehler++)
	{
	einfacher_test();
        }
	printf("\nBei %d Tests wurden im Durchschnitt %d Chipkarten eingezogen.", anzahl_tests, versuche);
    
}
Und der einfache_test:

Code:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int einfacher_test(void) 
{
    int versuche, zufall1, zufall2;
    srand((unsigned) time(NULL));
	
    for(versuche = 1; zufall1 != zufall2; versuche++)
    {	
    zufall1 = rand() % (9999 - 1111 + 1) + 1111;
    zufall2 = rand() % (9999 - 1111 + 1) + 1111;
    }
    
    printf("\n\nEs wurden %d Chipkarten eingezogen.", versuche);
    
    return 0;
	
}
Das ganze läuft über eine main-Funktion, die ein Auswahlmenü hat. Funzt ebenfalls.

Warum funktioniert der erste Durchlauf, danach allerdings keiner mehr?

Das Programm ist noch nicht fertig, also nicht wundern, dass es unvollständig aussieht.
Neo Larson ist offline   Mit Zitat antworten
Ungelesen 07.01.14, 14:39   #2
Matze500
Student der Informatik
 
Registriert seit: Jul 2010
Ort: NRW nähe Münster ;)
Beiträge: 355
Bedankt: 261
Matze500 ist noch neu hier! | 0 Respekt Punkte
Standard

So hab das mal eben durchlaufen lassen.

1.Fehler mehrere_test gibt keinen Wert zurück

2.Das versuche in mehrere_test ist nicht initialisiert steht irgend ein Müll immer drin.

Wenn ich 5 versuche mache läuft es bei mir sauber durch. Wie meinst du das, dass keiner der folgenden Durchläufe mehr funktioniert?

Jeder Test hat halt das selbe Ergebnis da du srand mit time(null) in jedem test vorinitialisierts.
Da der Zufall am PC in echt gar kein Zufall ist !!

Anbei dein Code etwas verändert damit auch das versuche mehr sin macht etc ...

Code:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int einfacher_test(void) 
{
    int versuche = 0;
    int zufall1 = 0;
    int zufall2 = 1;
	
    for(versuche = 1; zufall1 != zufall2; versuche++)
    {	
    zufall1 = rand() % (9999 - 1111 + 1) + 1111;
    zufall2 = rand() % (9999 - 1111 + 1) + 1111;
    }
    
    printf("\n\nEs wurden %d Chipkarten eingezogen.", versuche);
    
    return versuche;
	
}

int mehrfacher_test(void)
{
        srand((unsigned) time(NULL));
	int anzahl_tests;
	printf("Wie viel Tests sollen durchgefuehrt werden? ");
	scanf("%d", &anzahl_tests);
	int zaehler = 0;
        int versuche = 0;

	for(zaehler=1; zaehler<=anzahl_tests; zaehler++)
	{
	versuche += einfacher_test();
        }

	versuche = versuche / anzahl_tests;

	printf("\n\nBei %d Tests wurden im Durchschnitt %d Chipkarten eingezogen.", anzahl_tests, versuche);
    
	return 0;
}

int main(void)
{
	mehrfacher_test();
	fflush(stdin);
	getchar();
}
__________________
[ Link nur für registrierte Mitglieder sichtbar. Bitte einloggen oder neu registrieren ]
Powered by Windows 7
Matze500 ist offline   Mit Zitat antworten
Ungelesen 07.01.14, 14:41   #3
ChrizDoe
Anfänger
 
Registriert seit: Mar 2012
Beiträge: 12
Bedankt: 7
ChrizDoe ist noch neu hier! | 0 Respekt Punkte
Standard

in der einfacher_test funktion rufst du jedesmal srand auf, srand sollte aber nur einmal während der laufzeit aufgerufen werden da es den seed für die rand funktion bereitstellt und diese muss zur laufzeit nur einmal initialisiert werden.

In deiner mehrfacher_test funktion initialisierst du 'versuche' nie und weist der variablen auch nie etwas zu also kann da nichts vernünftiges rauskommen.
ChrizDoe ist offline   Mit Zitat antworten
Ungelesen 07.01.14, 15:59   #4
Neo Larson
Anfänger
 
Registriert seit: May 2010
Beiträge: 37
Bedankt: 0
Neo Larson ist noch neu hier! | 0 Respekt Punkte
Standard

Danke für die Antworten.

Ich hab die Funktionen nun in eigene Dateien gepackt:

main.c
einfacher_test.c
mehrfacher_test.c

main.h

Jetzt zeigt er mir bei mehrfacher_test.c einen Fehler:

Zeile 6 Spalte 1 [Error] expected '=', ',', ';', 'asm' or '__attribute__' before 'int'

Das ist da, wo die "int mehrfacher_test(void)"-Funktion anfängt.
Mit dem Verweis: In function 'einfacher_test'

Allerdings funktioniert der Code, wenn er innerhalb einer Datei geschrieben ist. Nur nicht, wenn ich die Funktionen ausgliedere.
Neo Larson ist offline   Mit Zitat antworten
Ungelesen 07.01.14, 15:59   #5
Neo Larson
Anfänger
 
Registriert seit: May 2010
Beiträge: 37
Bedankt: 0
Neo Larson ist noch neu hier! | 0 Respekt Punkte
Standard

Danke für die Antworten.

Ich hab die Funktionen nun in eigene Dateien gepackt:

main.c
einfacher_test.c
mehrfacher_test.c

main.h

Jetzt zeigt er mir bei mehrfacher_test.c einen Fehler:

Zeile 6 Spalte 1 [Error] expected '=', ',', ';', 'asm' or '__attribute__' before 'int'

Das ist da, wo die "int mehrfacher_test(void)"-Funktion anfängt.
Mit dem Verweis: In function 'einfacher_test'

Allerdings funktioniert der Code, wenn er innerhalb einer Datei geschrieben ist. Nur nicht, wenn ich die Funktionen ausgliedere.

EDIT: Ich hab den Code, bis auf die main-Funktion von Matze500 genommen.

Liegt das an der main?

Hier ist der Code:

Code:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "geldautomaten_check_main.h"

int main(void)
{
	srand((unsigned) time(NULL));
	int auswahl;
	printf("Test der Sicherheit eines Geldautomaten");
	printf("\n(1) Einfacher Test");
	printf("\n(2) Mehrfacher Test");
	printf("\n(3) Programm beenden\n");
	scanf("\n\n%d", &auswahl);
	
	switch (auswahl)
    {
    	case 1:
    		einfacher_test();
    		break;
    	case 2:
    		mehrfacher_test();
    		break;
    	case 3:
    		exit;
    		break;
    	default:
    		printf("Bitte ausschliesslich zwischen 1, 2 oder 3 waehlen!");
    }
}
Sollte doch eigentlich stimmen.
Neo Larson ist offline   Mit Zitat antworten
Ungelesen 07.01.14, 16:07   #6
Odatas
Erfahrenes Mitglied
 
Registriert seit: Nov 2011
Beiträge: 648
Bedankt: 326
Odatas ist unten durch! | -158 Respekt PunkteOdatas ist unten durch! | -158 Respekt Punkte
Standard

Ich habs mir jezt nicht angeschaut aber bitte bitte bitte. Variablen immer Initialisieren. Da kann so ein Mist bei entstehen und ein =0 macht auch kaum Arbeit. Also

int auswahl=0;
Odatas ist offline   Mit Zitat antworten
Ungelesen 07.01.14, 16:15   #7
Neo Larson
Anfänger
 
Registriert seit: May 2010
Beiträge: 37
Bedankt: 0
Neo Larson ist noch neu hier! | 0 Respekt Punkte
Standard

Danke, für den Hinweis, war mir nicht klar. Hab´s überall geändert.
Neo Larson ist offline   Mit Zitat antworten
Ungelesen 07.01.14, 16:18   #8
Odatas
Erfahrenes Mitglied
 
Registriert seit: Nov 2011
Beiträge: 648
Bedankt: 326
Odatas ist unten durch! | -158 Respekt PunkteOdatas ist unten durch! | -158 Respekt Punkte
Standard

Zitat:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "geldautomaten_check_main.h"
Fällt dir in der letzten Zeile im Gegesatz zu den anderen Zeilen nichts auf?
Odatas ist offline   Mit Zitat antworten
Ungelesen 07.01.14, 16:22   #9
Neo Larson
Anfänger
 
Registriert seit: May 2010
Beiträge: 37
Bedankt: 0
Neo Larson ist noch neu hier! | 0 Respekt Punkte
Standard

Das ist meine Header-Datei. Da ich die Funktionen in eigene Dateien gepackt habe, brauch ich doch eine, um sie zu verlinken. Ich hab´s so gelernt, Header-Dateien in Anführungszeichen zu setzen, wenn sie im gleichen Verzeichnis sind, wie die anderen Dateien. Sonst sucht er ja im Compiler-Verzeichnis danach. Oder liege ich da falsch.
Neo Larson ist offline   Mit Zitat antworten
Ungelesen 07.01.14, 16:27   #10
Odatas
Erfahrenes Mitglied
 
Registriert seit: Nov 2011
Beiträge: 648
Bedankt: 326
Odatas ist unten durch! | -158 Respekt PunkteOdatas ist unten durch! | -158 Respekt Punkte
Standard

Ups hab übersehen dass das deine Header Datei ist. Ne ist total richtig. Kannst du den Inhalt der Header Datei noch posten?
Odatas ist offline   Mit Zitat antworten
Ungelesen 07.01.14, 16:29   #11
Neo Larson
Anfänger
 
Registriert seit: May 2010
Beiträge: 37
Bedankt: 0
Neo Larson ist noch neu hier! | 0 Respekt Punkte
Standard

Inhalt der Header-Datei:

Code:
int einfacher_test(void)
int mehrfacher_test(void)
Neo Larson ist offline   Mit Zitat antworten
Ungelesen 07.01.14, 16:33   #12
Odatas
Erfahrenes Mitglied
 
Registriert seit: Nov 2011
Beiträge: 648
Bedankt: 326
Odatas ist unten durch! | -158 Respekt PunkteOdatas ist unten durch! | -158 Respekt Punkte
Standard

Da liegt der Fehler. Was willst du denn machen in der Header?
Odatas ist offline   Mit Zitat antworten
Ungelesen 07.01.14, 16:37   #13
Neo Larson
Anfänger
 
Registriert seit: May 2010
Beiträge: 37
Bedankt: 0
Neo Larson ist noch neu hier! | 0 Respekt Punkte
Standard

Hab´s grad gesehen. Ich hab die Semikolons vergessen. Nun läuft es.

Vielen Vielen Dank an alle beteiligten.

Ich werd sicherlich häufiger Fragen haben.

EDIT: Um deine Frage trotzdem zu beantworten. Ich will damit die Funktionen mit den anderen Dateien verlinken.
Neo Larson ist offline   Mit Zitat antworten
Antwort


Forumregeln
Du kannst keine neue Themen eröffnen
Du kannst keine Antworten verfassen
Du kannst keine Anhänge posten
Du kannst nicht deine Beiträge editieren

BB code is An
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist Aus.

Gehe zu


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:08 Uhr.


Sitemap

().