Random.nextInt(int n) wie zufällig ist die Zahl?

Johannes7146

Goldschnabel
Hallo zusammen,
wollte mal gucken wieviel Ziehungen ich brauche bis ich meine Wunschkombination an Zahlen beim Lotto gezogen bekomme....

Java:
package de.tutorials.johannes7146;

import java.text.DecimalFormat;
import java.util.Random;

public class Lotto extends Thread {

    private static DecimalFormat df = new DecimalFormat("###,###");

    public static void main(String[] args) {
        Lotto lotto = new Lotto();
        lotto.start();

    }

    @Override
    public void run() {
        System.out.println("START");
        int[] meinTipp = new int[] { 2,
                                    4,
                                    24,
                                    42,
                                    22,
                                    44 };
        ablauf(meinTipp);
        System.out.println("ENDE");
    }

    public void ablauf(int[] meinTipp) {

        int outputIntervall = 1000;
        int nextOutput = 1000;

        boolean juhu = false;
        int ziehungenAnzahl = 0;
        while (!juhu) {
            ziehungenAnzahl++;
            int[] ziehung = getAausB(6, 49);
            int richtige = getAnzahlUebereinstimmunge(meinTipp, ziehung);
            switch (richtige) {
            case 3:
                //System.out.println("3 Richtige nach " + df.format(i)  + " Ziehungen");
                break;
            case 4:
                //System.out.println("4 Richtige nach " + df.format(i)  + " Ziehungen");
                break;
            case 5:
                //System.out.println("5 Richtige nach " + df.format(i) + " Ziehungen");
                break;
            case 6:
                System.out.println("6 Richtige nach " + df.format(ziehungenAnzahl) + " Ziehungen");
                juhu = true;
                break;
            }

            if (ziehungenAnzahl == nextOutput) {
                nextOutput += outputIntervall;
                System.out.println("Ich bin grad bei Ziehung Nr.: " + df.format(ziehungenAnzahl));
            }

            //            try {
            //                Thread.sleep(1);
            //            } catch (InterruptedException e) {
            //                e.printStackTrace();
            //            }
        }
    }

    private static int getZufallsZahl(int max) {

        Random r = new Random();
        int zahl = r.nextInt(max);
        zahl++;
        return zahl;
    }

    private static int[] getAausB(int a, int b) {
        int[] zahlen = new int[a];
        for (int i = 0; i < a; i++) {
            boolean zahlHinzugefuegt = false;
            while (!zahlHinzugefuegt) {
                int z = getZufallsZahl(b);
                if (!contains(z, zahlen)) {
                    zahlen[i] = z;
                    zahlHinzugefuegt = true;

                }
            }
        }
        return zahlen;
    }

    private static boolean contains(int a, int[] b) {
        for (int i = 0; i < b.length; i++) {
            if (b[i] == a) {
                return true;
            }
        }
        return false;

    }

    private static int getAnzahlUebereinstimmunge(int[] a, int[] b) {
        int anzahl = 0;
        for (int i = 0; i < a.length; i++) {
            for (int j = 0; j < b.length; j++) {
                if (a[i] == b[j]) {
                    anzahl++;
                }
            }
        }
        return anzahl;
    }

}

Das ganze geht sicherlich auch schöner... aber es läuft :)

Meine Frage nun.... wie Zufällig ist die Methode Random.nextInt(int n) wirklich?
 

Matze

Weltenwanderer
Hallo,

wie zufällig sie ist kann ich dir zwar nicht sagen, aber ich kann dir als Tipp geben, dass die Klasse "SecureRandom" kryptografisch bessere Zufallszahlen liefert ;)
 
Ich weiß auch nicht genau, wie zufällig random.nextInt ist. In c++ hängen die meisten (alle die ich kenne) Zufallsfunktionen von der Zeit ab, die seit dem Start vergangen ist. Ich weiß, c++ ist nicht Java, aber da man in c++ diese Lösung getroffen hat, ist es gut möglich, das man eine ähnliche Lösung in Java getroffen hat. In C++ sind die "Zufälle" zufällig genug.

Außerdem: rein physikalisch gibt es gar keine Zufälle :)
 
Hallo zusammen,
wollte mal gucken wieviel Ziehungen ich brauche bis ich meine Wunschkombination an Zahlen beim Lotto gezogen bekomme....
Was ist denn rausgekommen? Der Erwartungswert müsste bei 49^6 = 13.841.287.201 Ziehungen liegen (geometrische Verteilung mit Erfolgswahrscheinlichkeit 1/49^6).

Meine Frage nun.... wie Zufällig ist die Methode Random.nextInt(int n) wirklich?
Diese Methode (und alle anderen der Klasse Random) gibt Pseudozufallszahlen (basierend auf einem linearen Kongruenzgenerator) zurück. Der Algorithmus zur Erzeugung der Zahlen ist also deterministisch und die Zahlen sind damit keine "echten" Zufallszahlen.

Außerdem: rein physikalisch gibt es gar keine Zufälle :)
Darüber ist sich die Wissenschaft aber noch nicht einig (je nachdem wie man die Ergebnisse der Quantentheorie interpretiert).

Grüße, Matthias
 

Neue Beiträge