2016-02-17 21 views
5

Ich schrieb Programm, das Würfel nächsteWie Java Zufallsgenerator funktioniert?

Random r = new Random(); 
    int result = r.nextInt(6); 
    System.out.println(result); 

Ich möchte wissen, ob es eine Möglichkeit, „vorhersagen“ nächste generierte Nummer und wie JVM bestimmt, welche Zahl zu erzeugen, simuliert?

Werden meine Code-Ausgabe-Zahlen bei jeder JVM und OS wirklich zufällig erscheinen?

+1

Es ist tatsächlich pseudozufällig. Dies bedeutet, dass sie nicht zufällig sind. Benutze immer denselben Samen und die Zahlen sind immer gleich. Warum? Versuchen Sie jemanden zu beeindrucken, der in der Lage ist, die Zukunft vorherzusagen? : P – Arc676

+0

Warum liest du nicht einfach die Dokumentation? https://docs.oracle.com/javase/8/docs/api/java/util/Random.html#next-int- – the8472

+1

Sie könnten es interessant finden, was Sie mit einer Auswahl zufälligen Samen tun können. http://vanillajava.blogspot.co.uk/2011/10/randomly-no-so-random.html –

Antwort

12

Sie sind Pseudozufallszahlen, was bedeutet, dass sie für allgemeine Absichten und Zwecke zufällig genug sind. Sie sind jedoch deterministisch und vollständig vom Samen abhängig. Der folgende Code wird die gleichen 10 Zahlen zweimal ausdrucken.

Random rnd = new Random(1234); 
for(int i = 0;i < 10; i++) 
    System.out.println(rnd.nextInt(100)); 

rnd = new Random(1234); 
for(int i = 0;i < 10; i++) 
    System.out.println(rnd.nextInt(100)); 

Wenn Sie die Samen können wählen, können Sie die Zahlen zuerst vorauszuberechnen, dann setzen Sie den Generator mit dem gleichen Samen, und Sie werden im Voraus wissen, welche Zahlen herauskommen.

1

Ja, es ist möglich vorherzusagen, welche Nummer ein Zufallsgenerator als nächstes erzeugen wird. Ich habe das als Rissen, Brechen oder Angriff auf den RNG gesehen. Die Suche nach einem dieser Begriffe zusammen mit "Zufallszahlengenerator" sollte viele Ergebnisse ergeben.

Gelesen How We Learned to Cheat at Online Poker: A Study in Software Security für eine ausgezeichnete aus erster Hand, wie ein Zufallszahlengenerator angegriffen werden kann. Zusammenfassend haben die Autoren herausgefunden, welche RNG basierend auf einem fehlerhaften Shuffling-Algorithmus, der von einer Online-Pokerseite verwendet wird, verwendet wurden. Sie ermittelten dann den RNG-Samen, indem sie Hände aushändigten, die ausgeteilt wurden. Sobald sie den Algorithmus und die Saat hatten, wussten sie genau, wie das Deck nach späteren Mischvorgängen angeordnet werden würde.

Sie können auch diese link verweisen.

1

prüfen How does java.util.Random work and how good is it:

Mit anderen Worten, beginnen wir mit einigen Start oder „Samen“ Zahl, die ideal „wirklich unberechenbar“ ist, und die in der Praxis ist „unberechenbar genug“. Zum Beispiel ist die Anzahl der Millisekunden - oder sogar Nanosekunden - seit dem Einschalten des Computers auf meisten Systemen verfügbar. Dann multiplizieren wir jedes Mal, wenn wir eine Zufallszahl wünschen, den aktuellen Anfangswert mit einer festen Zahl, a, fügen eine weitere feste Zahl, c, hinzu, dann nehmen wir das Ergebnis modulo eine andere feste Zahl, m. Die Zahl a ist allgemein groß. Diese Methode der Zufallszahlengenerierung geht zurück so ziemlich in die Morgendämmerung des Computing1. Ziemlich viel "zufällig" Zufallszahlengenerator, den Sie denken können - von denen der wissenschaftlichen Taschenrechner zu 1980s Heimcomputer zu C und Visual Basic Bibliotheksfunktionen- verwendet einige Variante der obigen Formel zu seine Zufallszahlen zu generieren.

Und auch Predicting the next Math.random() in Java

8

Ich möchte wissen, ob es eine Möglichkeit ist, „vorhersagen“ nächste generierte Nummer und wie bestimmt JVM, was Zahl neben generieren?

Absolut. Die Klasse Random ist als linearer Kongruenzzahlengenerator (LCNG) implementiert.Die allgemeine Formel für einen Kongruenzgenerator ist:

new_state = (old_state * C1 + C2) modulo N 

Der genaue Algorithmus, der von Random verwendet wird, in den javadocs angegeben. Wenn Sie den aktuellen Zustand des Generators kennen, ist der nächste Zustand vollständig vorhersehbar.

Werden meine Code-Ausgabe-Zahlen bei jeder JVM und OS wirklich zufällig erscheinen?

Wenn Sie Random verwenden, dann Nein. Nicht für JVM auf einem Betriebssystem.

Die von einem LCNG erzeugte Sequenz ist definitiv nicht zufällig und weist statistische Eigenschaften auf, die sich signifikant von einer echten Zufallssequenz unterscheiden. (Die Sequenz wird stark automatisch korreliert, und dies wird angezeigt, wenn Sie die Ergebnisse aufeinanderfolgender Anrufe auf Random.nextInt() plotten.)

Ist dies ein Problem? Nun, es hängt davon ab, was Ihre Anwendung braucht. Wenn Sie "zufällige" Zahlen benötigen, die schwer vorherzusagen sind (z. B. für einen Algorithmus, der sicherheitsrelevant ist), dann ist dies eindeutig nicht der Fall. Und wenn die Zahlen für eine Monte-Carlo-Simulation verwendet werden, kann die Inate-Autokorrelation eines LCNG die Simulation verzerren. Aber wenn Sie nur ein Solitaire-Kartenspiel bauen ... ist es vielleicht egal.

+0

Was meinst du mit dem aktuellen Stand? Und wird der vorherige Zustand gespeichert - wenn ja wie? – Lealo

+0

1) Die Werte der (privaten) Instanzvariablen des Generators. Sieh dir den Quellcode an. 2) AFAIK, Nein. –