![]() |
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 |
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 |
Wichtig ist, dass die Initialisierung wirklich nur einmal erfolgt.
|
Ich weiß nicht was du mit deiner Funktion vor hast aber so generiert man keine sicheren Zufallszahlen!
|
Zitat:
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. |
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. |
Welchen Sinn soll das bitte machen, wenn die Ergebnisse "zufällig" sind?
|
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... |
Zitat:
-Closed- |
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) Vielen Dank MfG Neo |
Das kannst du so machen. Du solltest aber wenigstens noch einen default case hinzufügen. Außerdem würde ich statt scanf() fgets() nehmen.
|
Wie funktioniert das dort mit dem Funktionsaufruf?
|
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) Code:
int einfacher_test(void) Code:
switch (auswahl) |
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> Code:
#include <stdio.h> Warum funktioniert der erste Durchlauf, danach allerdings keiner mehr? Das Programm ist noch nicht fertig, also nicht wundern, dass es unvollständig aussieht. |
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> |
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. |
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. |
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> |
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; |
Danke, für den Hinweis, war mir nicht klar. Hab´s überall geändert.
|
Du hast außerdem 2 mal case 2 genommen. Weiß nicht ob das so beabsichtig ist.
|
Zitat:
|
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.
|
Ups hab übersehen dass das deine Header Datei ist. Ne ist total richtig. Kannst du den Inhalt der Header Datei noch posten?
|
Inhalt der Header-Datei:
Code:
int einfacher_test(void) |
Da liegt der Fehler. Was willst du denn machen in der Header?
|
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. |
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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:44 Uhr. |
Powered by vBulletin® (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.