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