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