Gyakorlati alapok
Virtuális ötös lottó külön függvényeskedéssel III.
A fejezet gondolati és programozás-technikai előzményei...
-
a Virtuális ötös lottó külön függvényeskedéssel II. című fejezetekben,
...valamint annak házi feladatában (Találati szám) olvashatók.
A házi feladat már számolt találati számot is, tehát azt az értéket, hogy tippszámaink közül mennyi egyezett valamelyik lottószámmal. Ebben a rövid fejezetben sem lesz többről szó, a kódot csupán azzal egészítjük ki, hogy sokszor sorsolunk, illetve megnézzük a véletlenszámok által képviselt lottószámok számszerű előfordulásait. A sorsolási kör számát az int sorsolasiKor változó képviseli, a számok előfordulásainak tárolója pedig int[] elofordulas nevű tömb.
Amint arról már több helyen szóltam, alapjában véve nem voltam arról meggyőződve, hogy a Java által generált véletlenszámok és a valós lottószám-sorsolások matematikai valószínűségei azonosak. Ezzel természetesen a Java rendszertervezői is tisztában voltak és addig vacakolhattak a megfelelő matematikai függvénnyel, amíg az (determinisztikus volta ellenére) szintén kvázi véletlenszámokat szolgáltatott. Ha megnézzük a végeredményben a számeloszlásokat, akkor láthatjuk, hogy jó munkát végeztek.
A kód része Sike Zoltán informatika tanár oktatási anyagának. Nézzük meg a futtatható Java-kódot:
import java.util.Random;
import java.util.Scanner;
public class Main {
public static boolean benneVan(int szam, int[] tomb) {
boolean talalat = false;
for(int i = 0; i < tomb.length; i++) {
if(szam == tomb[i]) {
talalat =
true;
break;
}
}
return talalat;
}
public static int[] tombFeltoltes(int elemszam, int hatar) {
int[] tomb = new int[elemszam];
Random rnd = new Random();
int szam;
for(int i = 0; i < tomb.length; i++) {
do{
szam =
rnd.nextInt(hatar) + 1;
}while (benneVan(szam, tomb));
tomb[i] = szam;
}
return tomb;
}
public static void kiir(int[] tomb){
System.out.println();
for (int i = 0; i < tomb.length; i++) {
System.out.print(tomb[i]+" ");
}
}
public static int[] metszet(int[] szamok, int[] tippek) {
int[] tomb = new int[szamok.length + 1];
int db = 0;
for (int i = 0; i < szamok.length; i++) {
if(benneVan(szamok[i], tippek))
{
db++;
tomb[db] =
szamok[i];
}
}
tomb[0] = db;
return tomb;
}
public static void main(String[] args) {
int[] szamok = new int[5];
int[] tippek = new int[5];
int szam;
Scanner in = new Scanner(System.in);
for(int i = 0; i <= 4; i++) {
do{
System.out.print("Kérem a "+ (i + 1) + ". számot: ");
szam=in.nextInt();
}
while(benneVan(szam,tippek) || (szam < 1 || szam > 90));
tippek[i] = szam;
}
int[] talalatok = new int[6];
int[] aktualisTalalat = new int[6];
int[] elofordulas = new int[91];
int sorsolasiKor = 1000;
for(int i = 0; i < sorsolasiKor; i++) {
szamok = tombFeltoltes(5, 90);
for(int j = 0; j < szamok.length;
j++) {
elofordulas[szamok[j]]++;
}
aktualisTalalat = metszet(szamok,tippek);
talalatok[aktualisTalalat[0]]++;
}
System.out.println("\n" + sorsolasiKor + " keverés alatt a
találatok száma: " + talalatok[0]);
System.out.println();
for(int i = 1; i < elofordulas.length; i++){
System.out.println("A(z) " + i + "
előfordulása "
+
sorsolasiKor + " sorsolási kör alatt: " + elofordulas[i]);
}
}
}
Végeredmény:
Kérem a 1. számot: 1
Kérem a 2. számot: 23
Kérem a 3. számot: 23
Kérem a 3. számot: 34
Kérem a 4. számot: 56
Kérem a 5. számot: 45
1000 keverés alatt a találatok száma: 756
A(z) 1 előfordulása 1000 sorsolási kör alatt: 54
A(z) 2 előfordulása 1000 sorsolási kör alatt: 59
A(z) 3 előfordulása 1000 sorsolási kör alatt: 64
A(z) 4 előfordulása 1000 sorsolási kör alatt: 49
A(z) 5 előfordulása 1000 sorsolási kör alatt: 68
A(z) 6 előfordulása 1000 sorsolási kör alatt: 59
A(z) 7 előfordulása 1000 sorsolási kör alatt: 60
A(z) 8 előfordulása 1000 sorsolási kör alatt: 43
A(z) 9 előfordulása 1000 sorsolási kör alatt: 63
A(z) 10 előfordulása 1000 sorsolási kör alatt: 52
A(z) 11 előfordulása 1000 sorsolási kör alatt: 51
A(z) 12 előfordulása 1000 sorsolási kör alatt: 61
A(z) 13 előfordulása 1000 sorsolási kör alatt: 62
A(z) 14 előfordulása 1000 sorsolási kör alatt: 46
A(z) 15 előfordulása 1000 sorsolási kör alatt: 62
A(z) 16 előfordulása 1000 sorsolási kör alatt: 52
A(z) 17 előfordulása 1000 sorsolási kör alatt: 62
A(z) 18 előfordulása 1000 sorsolási kör alatt: 55
A(z) 19 előfordulása 1000 sorsolási kör alatt: 53
A(z) 20 előfordulása 1000 sorsolási kör alatt: 58
A(z) 21 előfordulása 1000 sorsolási kör alatt: 56
A(z) 22 előfordulása 1000 sorsolási kör alatt: 62
A(z) 23 előfordulása 1000 sorsolási kör alatt: 49
A(z) 24 előfordulása 1000 sorsolási kör alatt: 57
A(z) 25 előfordulása 1000 sorsolási kör alatt: 56
A(z) 26 előfordulása 1000 sorsolási kör alatt: 53
A(z) 27 előfordulása 1000 sorsolási kör alatt: 67
A(z) 28 előfordulása 1000 sorsolási kör alatt: 65
A(z) 29 előfordulása 1000 sorsolási kör alatt: 55
A(z) 30 előfordulása 1000 sorsolási kör alatt: 55
A(z) 31 előfordulása 1000 sorsolási kör alatt: 58
A(z) 32 előfordulása 1000 sorsolási kör alatt: 67
A(z) 33 előfordulása 1000 sorsolási kör alatt: 70
A(z) 34 előfordulása 1000 sorsolási kör alatt: 57
A(z) 35 előfordulása 1000 sorsolási kör alatt: 59
A(z) 36 előfordulása 1000 sorsolási kör alatt: 49
A(z) 37 előfordulása 1000 sorsolási kör alatt: 58
A(z) 38 előfordulása 1000 sorsolási kör alatt: 56
A(z) 39 előfordulása 1000 sorsolási kör alatt: 48
A(z) 40 előfordulása 1000 sorsolási kör alatt: 56
A(z) 41 előfordulása 1000 sorsolási kör alatt: 62
A(z) 42 előfordulása 1000 sorsolási kör alatt: 47
A(z) 43 előfordulása 1000 sorsolási kör alatt: 61
A(z) 44 előfordulása 1000 sorsolási kör alatt: 52
A(z) 45 előfordulása 1000 sorsolási kör alatt: 56
A(z) 46 előfordulása 1000 sorsolási kör alatt: 60
A(z) 47 előfordulása 1000 sorsolási kör alatt: 42
A(z) 48 előfordulása 1000 sorsolási kör alatt: 55
A(z) 49 előfordulása 1000 sorsolási kör alatt: 62
A(z) 50 előfordulása 1000 sorsolási kör alatt: 50
A(z) 51 előfordulása 1000 sorsolási kör alatt: 39
A(z) 52 előfordulása 1000 sorsolási kör alatt: 45
A(z) 53 előfordulása 1000 sorsolási kör alatt: 48
A(z) 54 előfordulása 1000 sorsolási kör alatt: 71
A(z) 55 előfordulása 1000 sorsolási kör alatt: 63
A(z) 56 előfordulása 1000 sorsolási kör alatt: 56
A(z) 57 előfordulása 1000 sorsolási kör alatt: 57
A(z) 58 előfordulása 1000 sorsolási kör alatt: 54
A(z) 59 előfordulása 1000 sorsolási kör alatt: 49
A(z) 60 előfordulása 1000 sorsolási kör alatt: 54
A(z) 61 előfordulása 1000 sorsolási kör alatt: 50
A(z) 62 előfordulása 1000 sorsolási kör alatt: 55
A(z) 63 előfordulása 1000 sorsolási kör alatt: 75
A(z) 64 előfordulása 1000 sorsolási kör alatt: 59
A(z) 65 előfordulása 1000 sorsolási kör alatt: 53
A(z) 66 előfordulása 1000 sorsolási kör alatt: 48
A(z) 67 előfordulása 1000 sorsolási kör alatt: 55
A(z) 68 előfordulása 1000 sorsolási kör alatt: 37
A(z) 69 előfordulása 1000 sorsolási kör alatt: 51
A(z) 70 előfordulása 1000 sorsolási kör alatt: 50
A(z) 71 előfordulása 1000 sorsolási kör alatt: 63
A(z) 72 előfordulása 1000 sorsolási kör alatt: 47
A(z) 73 előfordulása 1000 sorsolási kör alatt: 46
A(z) 74 előfordulása 1000 sorsolási kör alatt: 52
A(z) 75 előfordulása 1000 sorsolási kör alatt: 69
A(z) 76 előfordulása 1000 sorsolási kör alatt: 45
A(z) 77 előfordulása 1000 sorsolási kör alatt: 64
A(z) 78 előfordulása 1000 sorsolási kör alatt: 60
A(z) 79 előfordulása 1000 sorsolási kör alatt: 57
A(z) 80 előfordulása 1000 sorsolási kör alatt: 50
A(z) 81 előfordulása 1000 sorsolási kör alatt: 53
A(z) 82 előfordulása 1000 sorsolási kör alatt: 56
A(z) 83 előfordulása 1000 sorsolási kör alatt: 49
A(z) 84 előfordulása 1000 sorsolási kör alatt: 50
A(z) 85 előfordulása 1000 sorsolási kör alatt: 53
A(z) 86 előfordulása 1000 sorsolási kör alatt: 58
A(z) 87 előfordulása 1000 sorsolási kör alatt: 58
A(z) 88 előfordulása 1000 sorsolási kör alatt: 58
A(z) 89 előfordulása 1000 sorsolási kör alatt: 53
A(z) 90 előfordulása 1000 sorsolási kör alatt: 57
Házi feladat - Nézzük meg, hogy a Java rendszerprogramozói jó munkát végeztek-e a kvázi véletlenszámok generálásában! Hogyan tudnánk ezt leellenőrizni?
A megoldás fejezete a képre kattintva érhető el.