Zufallszahlen in C erzeugen

Slides:



Advertisements
Ähnliche Präsentationen
Ein Beispiel in Java.
Advertisements

Funktionen.
Forschungszentrum caesar
6. Der OpenMP Standard Direktiven-basiertes API zur Programmierung von Parallelrechnern mit gemeinsamem Speicher für FORTRAN, C und C++
Datentyp- umwandlung. Literale sind: Bezeichner mit einem festen Wert wie z.B:
REKURSION + ITERATION. Bemerkung: Die in den folgenden Folien angegebenen "Herleitungen" sind keine exakten Beweise, sondern Plausibilitätsbetrachtungen.
Strukturen. In einer Struktur kann eine beliebige Anzahl von Komponenten (Daten) mit unterschiedlichen Datentypen (im Gegensatz zu Feldern) zusammengefaßt.
ARRAY oder FELD oder VEKTOR
Dynamischer Speicher. Ein Vergleich aus dem täglichen Leben...
REKURSION + ITERATION. Bemerkung: Die in den folgenden Folien angegebenen "Herleitungen" sind keine exakten Beweise, sondern Plausibilitätsbetrachtungen.
Parameterübergabe von zweidimensionalen Feldern in Funktionen.
Polymorphie (Vielgestaltigkeit)
Dynamischer Speicher. In einer Funktion wird z.B. mit der Deklaration int i; Speicher auf dem sogenannten Stack reserviert. Wenn die Funktion verlassen.
Fuzzy-Logik und unscharfe Mengen
Kapitel 1 Das Schubfachprinzip
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 7 Claudio Moraga, Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
Java-Kurs - 2. Übung Entwicklungsumgebung Struktur von Programmen
PKJ 2005/1 Stefan Dissmann Methoden (Motivation) Idee: Identische Programmabschnitte zusammenfassen und mit einem Namen versehen Vorteile: Übersichtlichkeit.
Zusammenfassung Vorwoche
Wichtige Fachausdrücke in C
Einführung in die Programmiersprache C 1
Einführung in die Programmiersprache C 3.Tag Institut für Mathematische Optimierung - Technische Universität Braunschweig.
Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung ins Lösen von Textaufgaben (Textgleichungen)
Arrays / Felder Themen: Arrays / Felder / Vektoren Was soll das eigentlich? Erstellen von Arrays Arrays auslesen. Wie sie verwaltet werden.
BMEVIEEA100 Grundlagen der Programmierung
Vorlesung 3. if else Anweisung if (Ausdruck) Anweisung1 else Anweisung2 Ausdruck hat einen von 0 verschiedenen Wert, so wird Anweisung 1 ausgeführt. Bei.
Vorlesung 5. #include double fv(double x) { return sin(x); } int main(){ int i,N=10; double a=1,b=2,del,x,sum,f,integral; for(i=1,sum=0.0,del = (b-a)/N;i
early binding (frühe Bindung) late binding (späte Bindung)
Zufallsprogrammierung
Erweiterte Zuweisungskompatibilität. Wie kann man Objekte verschiedener Klassen einer Klassenhierarchie einander zuweisen ?
Variablen und Datentypen
Unterprogramme / Methoden
Fernsehgewohnheiten Wie viel Zeit verbringen Sie pro Tag bzw. pro Woche vor dem Fernseher? Welche Sendungen sehen Sie sich an? Warum schauen Sie diese.
Funktionen. Aufgabe : Eingabe zweier Zahlen ---> Minimum bestimmen Dann nochmals Eingabe zweier Zahlen ---> Minimum bestimmen.
REKURSION + ITERATION. Bemerkung: Die in den folgenden Folien angegebenen "Herleitungen" sind keine exakten Beweise, sondern Plausibilitätsbetrachtungen.
Verzweigung oder bedingte Anweisung. Aufgabe: Ein Autofahrer tankt sein Auto voll und schreibt den Kilometerstand auf (drei- stelliger Tageszähler).Wenn.
Pointer. Grundsätzliches: Im Arbeitsspeicher werden Daten gespeichert. Um auf die Daten eindeutig zugreifen zu können, werden diesen Daten Adressen zugeordnet.
Funktionen, Felder und Parameter- übergabe. Funktionsaufruf mit Feld als Parameter: Parameter = Name des Feldes.
TRUE und FALSE in C Der Wert 0 steht für FALSE Jeder von 0 verschiedene Wert steht für TRUE FALSE wird als 0 dargestellt TRUE wird als 1 dargestellt.
Java Programme nur ein bisschen objektorientiert.
FOR Anweisung. Aufgabe : Ausgabe aller ganzen Zahlen von 0 bis 100 auf dem Bildschirm.
C++ FÜR cOMPUTERSPIELENTWICKLER
Funktionen (Zweck und Eigenschaften) Funktionen sind Unterprogramme, die einen bestimmten Zweck erfüllen Sie zerlegen Probleme in kleine, abgeschlossene.
Verschachtelte Schleifen
Gleichung und ihre Lösung
Konstruktoren.
Java-Kurs Übung Grafik in Java - das Abstract Windowing Toolkit
Vorlesung AVL-Bäume/Algorithmen-
Zufall in Java Zwei Möglichkeiten.
Vorlesung AVL-Bäume/Algorithmen-
Arguments to main() int main(int argc, char *argv[]) { int i;
Durchschnitt (verbal)
Auf welche Zahl zeigt der Pfeil?
Dynamisches Array als "verkettete Liste"
Einführung in die Programmierung
und seine mathematischen Folgen
Einführung in die Programmierung
Es gibt Klassen, die mit der Entwicklungsumgebung ausgeliefert werden
Arrays in Java Ein Array ist eine Variable, die aus einer An-zahl von Elementen des gleichen Datentyps besteht, die aufeinanderfolgend im Speicher liegen.
Arrays in C Ein Array ist eine Variable, die aus einer Anzahl von Elementen des gleichen Datentyps besteht, die aufeinanderfolgend im Speicher liegen.
Einführung in die Programmierung
REKURSION + ITERATION.
Test über [Thema] [Ihr Name] [Datum].
Das Vektorprodukt Wir definieren erneut eine Multiplikation zwischen zwei Vektoren, das Vektorprodukt, nicht zu verwechseln mit dem Skalarprodukt. Schreibe.
Datentyp- umwandlung.
Einführung in die Programmierung
 Präsentation transkript:

Zufallszahlen in C erzeugen Weiter mit PP.

#include <stdlib.h> #include <stdio.h> #include "stdafx.h" #include <stdlib.h> #include <stdio.h> #include <time.h> int main(){ int zufallszahl1; // srand bitte nur EINMAL aufrufen // ganz am Anfang !!!!!! srand((unsigned)time(NULL)); zufallszahl1 = rand(); return 0; } erzeugt abhängig von der aktuellen Uhrzeit einen neuen Satz von Zufallszahlen Damit soll verhindert werden, dass bei einem erneuten Aufruf dieses Programms genau die gleichen Zufallszahlen kommen. Teilziel: "Grob-Struktur" eines Programms verstehen. Bemerkung: Evtl. ein Arbeitsblatt daraus machen. Weiter mit PP.

#include <stdlib.h> #include <stdio.h> #include "stdafx.h" #include <stdlib.h> #include <stdio.h> #include <time.h> int main(){ int zufallszahl1; // srand bitte nur EINMAL aufrufen // ganz am Anfang !!!!!! srand((unsigned)time(NULL)); zufallszahl1 = rand(); return 0; } aus diesem Satz von Zufallszahlen wird mit rand() die nächste herausgeholt. rand() liefert eine ganze Zahl zurück. Teilziel: "Grob-Struktur" eines Programms verstehen. Bemerkung: Evtl. ein Arbeitsblatt daraus machen. Weiter mit PP. Diese nimmt einen Wert zwischen 0 und RAND_MAX (= 32767) an (je einschließlich). 3

Problem 1: Wie bekommt man aber Zufallszahlen aus der Menge {1, 2, 3, 4, 5, 6} um z.B. einen Würfel zu simulieren? Weiter mit PP. 4

Zurück zur Grundschule: Man verteilt (gleichmäßig) eine bestimmte Anzahl Computer auf 6 Schüler. Wieviel Computer können dabei übrig bleiben (minimal und maximal)? Weiter mit PP. 5

Es bleiben minimal 0 Computer und maximal 5 übrig Es bleiben minimal 0 Computer und maximal 5 übrig. Man bekommt also eine Zahl zwischen 0 und 5. Weiter mit PP. 6

Mathematisch: erg = anzahl % 6 wobei erg die Werte aus der Menge {0, 1, 2, 3, 4, 5} annehmen kann. Weiter mit PP. 7

Was muss man mathematisch nur noch machen, daß erg Werte aus der Menge {1, 2, 3, 4, 5, 6} annehmen kann ? Weiter mit PP. 8

Man muss zu erg die Zahl 1 dazu addieren, also: erg = anzahl % 6 + 1; Oder, wenn anzahl eine Zufallszahl sein soll: anzahl = rand() % 6 + 1; Weiter mit PP. 9

#include <stdlib.h> #include <stdio.h> #include "stdafx.h" #include <stdlib.h> #include <stdio.h> #include <time.h> int main(){ int zufallszahl; // srand bitte nur EINMAL aufrufen // ganz am Anfang !!!!!! srand((unsigned)time(NULL)); zufallszahl = rand()%6+1; return 0; } Teilziel: "Grob-Struktur" eines Programms verstehen. Bemerkung: Evtl. ein Arbeitsblatt daraus machen. Weiter mit PP. Die Variable zufallszahl nimmt einen Wert aus der Menge {1, 2, 3, 4, 5 , 6} an. 10

Problem 2: Wie bekommt man aber eine Zufallszahl (Fließkommazahl) zwischen 0 und 1 ? Um z.B. einen Dartspfeil zu simulieren, der innerhalb der Strecke des Zahlenstrahls zwischen 0 und 1 einschlägt. Weiter mit PP. 11

Die größte Zufallszahl ist RAND_MAX (= 32767) Welche Werte kann dann der folgende Term annehmen? rand() / RAND_MAX Überlegen Sie dazu, welche Werte rand() annehmen kann! Weiter mit PP. 12

rand() nimmt Werte zwischen 0 und RAND_MAX (= 32767) an. Also kann rand() / RAND_MAX folgende Werte annehmen: Weiter mit PP. 13

0 / 32767 = 0 1 / 32767 2 / 32767 ... 32765 / 32767 32766 / 32767 32767 / 32767 = 1 Weiter mit PP. 14

rand() / RAND_MAX nimmt zwar nicht alle Werte (unendlich viele) zwischen 0 und 1 an, sondern nur 32768 Werte. Das ist aber eine so gute Näherung, daß man damit arbeiten kann. Weiter mit PP. 15

Problem 3: Eine zufällige Zufallszahl (Fließkommazahl) zwischen 0 und 1 können wir jetzt zwar erzeugen. Weiter mit PP. 16

Aber wie kann man zu einer vorgegeben Zahl z eine Zufallzahl (Fließkommazahl) zwischen 0 und z erzeugen ? Dartspfeil soll innerhalb der Strecke des Zahlenstrahls zwischen 0 und z einschlagen! Weiter mit PP. 17

Angenommen zv_0_1 sei eine Variable (Fließkommazahl), die zufällige Werte zwischen 0 und 1 annimmt. Welche Werte nimmt dann der folgende Ausdruck an (minimal und maximal)? zv_0_1 * z Weiter mit PP. 18

zv_0_1 ist minimal 0, also: zv_0_1 * z = 0 zv_0_1 ist maximal 1, also: Welche Werte nimmt zv_0_1 * z an, wenn zv_0_1 die folgenden Werte annimt: 0,25 0,5 0,75 Weiter mit PP. 19

zv_0_1 = 0,25, also: zv_0_1. z = 0,25 z zv_0_1 = 0,5, also: zv_0_1 zv_0_1 = 0,25, also: zv_0_1 * z = 0,25 z zv_0_1 = 0,5, also: zv_0_1 * z = 0,5 z zv_0_1 = 0,75, also: zv_0_1 * z = 0,75 z Weiter mit PP. 20

Welche Werte durchläuft (durchwandert) also zv_0_1 * z wenn zv_0_1 alle Werte (Fließkommazahlen) zwischen 0 und 1 durchläuft ? Weiter mit PP. 21

Alle Werte (Fließkommazahlen) zwischen 0 und z Weiter mit PP. 22

#include <stdlib.h> #include <stdio.h> #include "stdafx.h" #include <stdlib.h> #include <stdio.h> #include <time.h> // Rest kommt gleich Teilziel: "Grob-Struktur" eines Programms verstehen. Bemerkung: Evtl. ein Arbeitsblatt daraus machen. Weiter mit PP. 23

Warum ist der Wert von zufallszahl immer 0 oder ganz selten 1? int main(){ double zufallszahl; double z; // srand bitte nur EINMAL aufrufen // ganz am Anfang !!!!!! srand((unsigned)time(NULL)); // Für z könnte man auch einen Wert // über Tastatur eingeben. z=123456.789; zufallszahl = rand()/RAND_MAX * z; return 0; } Warum ist der Wert von zufallszahl immer 0 oder ganz selten 1? Teilziel: "Grob-Struktur" eines Programms verstehen. Bemerkung: Evtl. ein Arbeitsblatt daraus machen. Weiter mit PP. Warum liefert rand() / RAND_MAX * z keine Zufallszahl? Was ist falsch ? 24

Wie wird der Ausdruck richtig? int main(){ double zufallszahl; double z; // srand bitte nur EINMAL aufrufen // ganz am Anfang !!!!!! srand((unsigned)time(NULL)); // Für z könnte man auch einen Wert // über Tastatur eingeben. z=123456.789; zufallszahl = rand()/RAND_MAX * z; return 0; } Wie wird der Ausdruck richtig? Teilziel: "Grob-Struktur" eines Programms verstehen. Bemerkung: Evtl. ein Arbeitsblatt daraus machen. Weiter mit PP. Weil rand() und RAND_MAX den Datentyp int hat und int / int wieder int ergibt (der Nachkommateil wird abgeschnitten). Da rand() / RAND_MAX <=1, wird der Nachkommateil abgeschnitten und 0 oder 1 bleibt übrig! 25

Datentypumwandlung:int in double umwandeln! int main(){ double zufallszahl; double z; // srand bitte nur EINMAL aufrufen // ganz am Anfang !!!!!! srand((unsigned)time(NULL)); // Für z könnte man auch einen Wert // über Tastatur eingeben. z=123456.789; zufallszahl = (double)rand()/(double)RAND_MAX*z; return 0; } Datentypumwandlung:int in double umwandeln! Teilziel: "Grob-Struktur" eines Programms verstehen. Bemerkung: Evtl. ein Arbeitsblatt daraus machen. Weiter mit PP. 26