Willkommen |
|
myGully |
|
Links |
|
Forum |
|
|
|
|
31.12.13, 10:33
|
#1
|
Anfänger
Registriert seit: May 2010
Beiträge: 37
Bedankt: 0
|
Zufallszahlengenerator
Hallo.
Ich lerne grad die Programmiersprache C und bräuchte eure Hilfe.
Ich habe einen Zufallszahlengenerator bekommen, den möchte ich nun in ein Programm bekommen. Nur leider hab ich keinerlei Erklärung zu diesem. Kann mir jemand den beschreiben? Hier ist er:
#include <stdlib.h>
#include <time.h>
void initialisiere_zufallszahlengenerator(void)
{
srand((unsigned) time(NULL));
}
int liefere_ganze_zufallszahl(int min, int max)
{
return (rand() % (max - min + 1)) + min;
}
Vielen Dank für die Hilfe
MfG Neo
|
|
|
31.12.13, 11:03
|
#2
|
Newbie
Registriert seit: Dec 2009
Beiträge: 50
Bedankt: 28
|
Hallo,
ich hab mal mit "-" Sachen markiert, die nötig zu wissen sind, mit "*" optionale Erklärungen
initialisiere_zufallszahlengenerator()
- wie der Bezeichner schon vermuten lässt wird hiermit der "Zufallsgenerator" initialisiert
* mit srand() beginnt eine Zeitmessung, die vergangene Zeit wird nachher deine "Zufallszahl"
int liefere_ganze_zufallszahl(int min, int max)
- gib ein Minimum / Maximum für deine gewünschte Zufallszahl an und bekomme eine zwischen den beiden wieder, z.B.:
initialisiere_zufallszahlengenerator();
int random = liefere_ganze_zufallszahl(17, 56); //liefert eine ganze Zahl zwischen 17 und 56
// größer gleich 17 und kleiner gleich 56, also beides inklusive
*mit rand() bekommt man die vergangene Zeit in ms, diese wird hier mit modulo (max - min +1) auf die Differenz von den gewählten Minimum/Maximum getrimmt (in dem Fall dann Zahlen von 0 - <Differenz> // inklusiv der Differenz ); wenn man zum Beispiel min 46 und max 70 wählt und mit srand()/rand() 1033ms vergangen sind: rand() % (70 - 46 + 1) = 1033 % 25 = 8
*am Ende wird noch mal das Minimum addiert um in den richtigen Intervall zu kommen;
in meinem Beispiel also noch: 8 + 46 = 54 ... das wäre dann das Ergebnis
Viel Spaß noch
|
|
|
01.01.14, 12:24
|
#3
|
¥
Registriert seit: Jul 2013
Beiträge: 6
Bedankt: 3
|
Wichtig ist, dass die Initialisierung wirklich nur einmal erfolgt.
|
|
|
01.01.14, 12:31
|
#4
|
Echter Freak
Registriert seit: Mar 2010
Ort: /home/spartan-b292
Beiträge: 2.866
Bedankt: 1.700
|
Ich weiß nicht was du mit deiner Funktion vor hast aber so generiert man keine sicheren Zufallszahlen!
__________________
"They who can give up essential liberty to obtain a little temporary safety, deserve neither liberty nor safety"
|
|
|
01.01.14, 21:10
|
#5
|
Anfänger
Registriert seit: Jun 2010
Beiträge: 17
Bedankt: 2
|
Zitat:
Zitat von mrburns
Hallo,
* mit srand() beginnt eine Zeitmessung, die vergangene Zeit wird nachher deine "Zufallszahl"
*mit rand() bekommt man die vergangene Zeit in ms, diese wird hier mit modulo (max - min +1) auf die Differenz von den gewählten Minimum/Maximum getrimmt (in dem Fall dann Zahlen von 0 - <Differenz> // inklusiv der Differenz ); wenn man zum Beispiel min 46 und max 70 wählt und mit srand()/rand() 1033ms vergangen sind: rand() % (70 - 46 + 1) = 1033 % 25 = 8
|
Das ist völliger Unsinn, weder srand noch rand hat etwas mit der Zeit zutun, time() liefert die zeit, das wars aber auch. srand legt den seed, also den initialwert der rand Funktion fest. Die rand Funktion liefert eine Zufallszahl die durch eine Polynomfunktion mit dem vorigen Wert oder dem Initialwert als Variablen bestimmt wird.
|
|
|
02.01.14, 08:44
|
#6
|
Anfänger
Registriert seit: May 2010
Beiträge: 37
Bedankt: 0
|
Vielen Dank für die Hilfe.
Ich muss eine Simulation eines Sicherheitssystems von Geldautomaten schreiben. Dazu soll halt ne PIN generiert werden, die dann mit Zufall-PINs "geknackt" werden soll. Ausgegeben werden z.b. Es wurden 720 Chipkarten eingezogen (bis eine richtige PIN erraten wurde). Die PINs werden jedesmal neu generiert.
Ist für ne Hausaufgabe, deshalb hab ich nur nach dem Zufallszahlengenerator gefragt.
|
|
|
02.01.14, 09:19
|
#7
|
Banned
Registriert seit: Aug 2012
Beiträge: 223
Bedankt: 68
|
Welchen Sinn soll das bitte machen, wenn die Ergebnisse "zufällig" sind?
|
|
|
02.01.14, 21:23
|
#8
|
Anfänger
Registriert seit: May 2010
Beiträge: 37
Bedankt: 0
|
Einfach nur, weil man´s kann Hausaufgabe...
Danke trotzdem für jeglichen Kommentar.
Ich werd sicherlich hin und wieder nen Tip brauchen und bin dankbar, solch einForum nutzen zu können.
Sollte mal gesagt werden. Frohes Neues und auf Wiedersehen.
Ich weiß nicht, wie man nen Thread schließt...
|
|
|
04.01.14, 18:00
|
#9
|
abcdefgh
Registriert seit: Oct 2008
Ort: Ziegengehege
Beiträge: 2.649
Bedankt: 2.519
|
Zitat:
Zitat von Neo Larson
Ich weiß nicht, wie man nen Thread schließt...
|
Am Besten den eigenen Beitrag melden mit der Bitte um Schließung!
-Closed-
|
|
|
06.01.14, 18:30
|
#10
|
Anfänger
Registriert seit: May 2010
Beiträge: 37
Bedankt: 0
|
In C mit switch-case Funktion aufrufen?
Hi.
Ich wollte mal fragen, ob man in meinem Fall mit switch-case arbeiten kann?
Ich möchte mit C ein Menü, bestehend aus drei Auswahlmöglichkeiten, programmieren.
Bei der ersten und zweiten Auswahl soll jeweils eine Funktion aufgerufen werden.
Bei drittens soll das Programm beendet werden.
So ungefähr:
Code:
int main(void)
{
int auswahl;
printf("Test der Sicherheit eines Geldautomaten");
printf("\n(1) Einfacher Test");
printf("\n(2) Mehrfacher Test");
printf("\n(3) Programm beenden");
scanf("%d", &auswahl);
switch (auswahl)
{
case 1: // Hier soll die Funktion "Einfacher Test" ausgeführt werden
break;
case 2: // Hier soll die Funktion "Mehrfacher Test" ausgeführt werden.
break;
case 3: // Hier soll das Programm beendet werden
}
}
Einfacher Test und Mehrfacher Test sind in verschiedene Dateien mit einer Header-Datei geschrieben.
Vielen Dank
MfG Neo
|
|
|
06.01.14, 19:42
|
#11
|
Echter Freak
Registriert seit: Mar 2010
Ort: /home/spartan-b292
Beiträge: 2.866
Bedankt: 1.700
|
Das kannst du so machen. Du solltest aber wenigstens noch einen default case hinzufügen. Außerdem würde ich statt scanf() fgets() nehmen.
__________________
"They who can give up essential liberty to obtain a little temporary safety, deserve neither liberty nor safety"
|
|
|
07.01.14, 05:10
|
#12
|
Anfänger
Registriert seit: May 2010
Beiträge: 37
Bedankt: 0
|
Wie funktioniert das dort mit dem Funktionsaufruf?
|
|
|
07.01.14, 06:56
|
#13
|
Anfänger
Registriert seit: May 2010
Beiträge: 37
Bedankt: 0
|
Leider nicht, oder ich übersehe es.
Bei Google find ich nur printf-Funktionen in case.
Ich hab das mal probiert, funktioniert aber nicht:
Code:
switch (auswahl)
{
case 1:
int einfacher_test();
break;
case 2:
int mehrfacher_test();
break;
case 2:
exit;
break;
}
Hier ist die Funktion, sie selbst funktioniert auch:
Code:
int einfacher_test(void)
{
}
EDIT: Ok, hab´s nun. Mein Fehler war den Datentyp mit hinzuschreiben. So ist´s richtig.
Code:
switch (auswahl)
{
case 1:
einfacher_test();
break;
|
|
|
07.01.14, 11:00
|
#14
|
Anfänger
Registriert seit: May 2010
Beiträge: 37
Bedankt: 0
|
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.
|
|
|
07.01.14, 14:39
|
#15
|
Student der Informatik
Registriert seit: Jul 2010
Ort: NRW nähe Münster ;)
Beiträge: 356
Bedankt: 261
|
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();
}
|
|
|
07.01.14, 14:41
|
#16
|
Anfänger
Registriert seit: Mar 2012
Beiträge: 12
Bedankt: 7
|
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.
|
|
|
07.01.14, 15:59
|
#17
|
Anfänger
Registriert seit: May 2010
Beiträge: 37
Bedankt: 0
|
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.
|
|
|
07.01.14, 15:59
|
#18
|
Anfänger
Registriert seit: May 2010
Beiträge: 37
Bedankt: 0
|
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.
|
|
|
07.01.14, 16:07
|
#19
|
Erfahrenes Mitglied
Registriert seit: Nov 2011
Beiträge: 651
Bedankt: 326
|
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;
|
|
|
07.01.14, 16:15
|
#20
|
Anfänger
Registriert seit: May 2010
Beiträge: 37
Bedankt: 0
|
Danke, für den Hinweis, war mir nicht klar. Hab´s überall geändert.
|
|
|
07.01.14, 16:15
|
#21
|
Erfahrenes Mitglied
Registriert seit: Nov 2011
Beiträge: 651
Bedankt: 326
|
Du hast außerdem 2 mal case 2 genommen. Weiß nicht ob das so beabsichtig ist.
|
|
|
07.01.14, 16:18
|
#22
|
Erfahrenes Mitglied
Registriert seit: Nov 2011
Beiträge: 651
Bedankt: 326
|
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?
|
|
|
07.01.14, 16:22
|
#23
|
Anfänger
Registriert seit: May 2010
Beiträge: 37
Bedankt: 0
|
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.
|
|
|
07.01.14, 16:27
|
#24
|
Erfahrenes Mitglied
Registriert seit: Nov 2011
Beiträge: 651
Bedankt: 326
|
Ups hab übersehen dass das deine Header Datei ist. Ne ist total richtig. Kannst du den Inhalt der Header Datei noch posten?
|
|
|
07.01.14, 16:29
|
#25
|
Anfänger
Registriert seit: May 2010
Beiträge: 37
Bedankt: 0
|
Inhalt der Header-Datei:
Code:
int einfacher_test(void)
int mehrfacher_test(void)
|
|
|
07.01.14, 16:33
|
#26
|
Erfahrenes Mitglied
Registriert seit: Nov 2011
Beiträge: 651
Bedankt: 326
|
Da liegt der Fehler. Was willst du denn machen in der Header?
|
|
|
07.01.14, 16:37
|
#27
|
Anfänger
Registriert seit: May 2010
Beiträge: 37
Bedankt: 0
|
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.
|
|
|
07.01.14, 17:34
|
#28
|
Echter Freak
Registriert seit: Mar 2010
Ort: /home/spartan-b292
Beiträge: 2.866
Bedankt: 1.700
|
Da es ja bei deinen Fragen immer um das selbe Programm geht habe ich die Themen jetzt mal zusammengeschoben.
Generell würde ich dir empfehlen deine Probleme selbst zu lösen und den Umgang mit Werkzeugen wie Valgrind (o.ä) zu lernen.
__________________
"They who can give up essential liberty to obtain a little temporary safety, deserve neither liberty nor safety"
|
|
|
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
HTML-Code ist Aus.
|
|
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:16 Uhr.
().
|