Wie und Prinzip der Zufallszahlen in Java
Überprüfen Sie die Informationen zu Zufallsnummern und organisieren Sie sie speziell
Lassen Sie uns zunächst über verschiedene Möglichkeiten sprechen, um zufällige Zahlen in Java zu generieren
En. . . Tatsächlich wird die obige dritte Methode verwendet, um zufällige Zahlen in der Standardkonstruktionsmethode von Random zu generieren.
Es gibt zwei Möglichkeiten, eine zufällige Klasse in Methode 2 zu erstellen: mit Samen und ohne Samen
Ohne Saatgut: Diese Methode gibt zufällige Zahlen zurück, und die Ergebnisse jedes Laufs sind unterschiedlich, was der Verwendung von Systems entspricht.
Bei Samen: Auf diese Weise wird das Rückgabeergebnis das gleiche sein, egal wie oft das Programm ausgeführt wird. Wenn zwei zufällige Instanzen mit demselben Samen erstellt werden, wird dieselbe Abfolge von Methodenaufrufen für jede Instanz erstellt und die gleiche Abfolge von Zahlen erzeugt und zurückgibt.
Pseudo-Random-Nummer
Zufällige Zahlen in Computern sind Pseudo-Random-Zahlen
Hier ist ein C -Programm wie folgt:
// rand_1.cpp#include <stdlib.h> statische unsignierte int rand_seed; unsigned int random (void) {rand_seed = (rand_seed*123+59)%65536; return (rand_seed);} void random_start (void) {int temp [2]; bewegt (0x0040,0x006c, fp_seg (temp), fp_off (temp), 4); Rand_seed = temp [0];} void main () {unsigned int i, n; random_start (); für (i = 0; i <10; i ++) printf ("#u/t", random ()); printf ("/n");} Es erklärt den Prozess der Zufallszahlengenerierung vollständig:
Erste,
bewegt (0x0040,0x006c, fp_seg (temp), fp_off (temp), 4);
Diese Funktion wird verwendet, um Speicherdaten zu verschieben. FP_SEG (weitaus Zeiger auf Segment) ist eine Funktion, die die Segmentadresse des Temp -Arrays übernimmt. Auf diese Weise kann eine 16-Bit-Nummer bei 0040: 006Ch über das Temp-Array an rand_seed gesendet werden.
Zweite,
Rand_seed = (Rand_Seed*123+59)%65536;
Es handelt sich um eine Methode zur Berechnung von Zufallszahlen. Die Berechnungsmethode der Zufallszahlen unterscheidet sich in verschiedenen Computern, selbst in verschiedenen im selben Computer installierten Betriebssystemen. Ich habe es in Linux bzw. Windows ausprobiert. Die zufälligen Zahlen, die durch die gleichen Zufallssamen in diesen beiden Betriebssystemen erzeugt werden, sind unterschiedlich, was bedeutet, dass sie unterschiedliche Berechnungsmethoden haben.
Dann,
bewegt (0x0040,0x006c, fp_seg (temp), fp_off (temp), 4);
Warum müssen zufällige Samen im Speicher bei 0040: 006Ch abgerufen werden? Was wird bei 0040: 006Ch aufbewahrt?
Diejenigen, die den Kurs "Prinzipien von Computerkomponenten und Schnittstellentechnologie" untersucht haben, erinnern sich möglicherweise daran, dass beim Kompilieren des ROM BIOS Clock Interrupt -Service -Programms das Timing/Zähler von Intel 8253 verwendet wird. Die Kommunikation mit dem Intel 8259 Interrupt Chip ermöglicht das Interrupt -Service -Programm. Die 18,2 -Unterbrechungen, die vom Motherboard pro Sekunde erzeugt werden, werden vom Prozessor erzeugt, der den Interrupt -Chip basierend auf dem Zeit-/Zählerwert steuert. Auf dem Motherboard unseres Computers befindet sich ein solches Timing/Zähler, um die aktuelle Systemzeit zu berechnen. Der Zähler wird jedes Mal hinzugefügt, wenn ein Taktsignalzyklus passt. Wo ist der Wert dieses Zählers gespeichert? Das ist richtig, gerade um 0040: 006Ch im Speicher ist dieser Speicherplatz tatsächlich so definiert:
Timer_low dw?; Die Adresse ist 0040: 006Ch
Timer_High dw?; Die Adresse ist 0040: 006EH
Timer_oft db? ; Die Adresse ist 0040: 0070H
Im Clock Interrupt-Service-Programm wird auch der Zähler voll und ganz, wenn Timer_low voll wird, und der Wert des Zählers ist Null, dh der 16-Bit-Binäran der Timer_low ist mit Null und Timer_High eins hinzu. in Rand01.c
bewegt (0x0040,0x006c, fp_seg (temp), fp_off (temp), 4);
Genau die beiden 16-Bit-Binärzahlen Timer_low und Timer_High werden in das Temp-Array aufgenommen und an rand_seed gesendet, wodurch der "zufällige Samen" erhält.
Eine Sache, die bestimmt werden kann, ist, dass der zufällige Saatgut aus der Systemuhr stammt, oder vielmehr den Datensatzwert im Speicher aus dem Zeitpunkt/Zähler auf dem Computer -Motherboard.
En ... nein letztes. . lvl--
Schauen wir uns einen anderen Code an:
//rand_2.cpp#include <iostream> #include <cstdlib> Verwenden von Namespace std; int main () {srand ((nicht signiert) Zeit (null)); nicht signiert int r = rand (); cout << "r =" << r << endl; // Gemäß dem C ++ 98 -Standard kann die Hauptfunktion eingeführt werden, ohne die Rückgabeanweisung zu verwenden, um 0;} zurückzugeben;} Wenn der Benutzer und andere Programme keinen zufälligen Saatgut festlegen, wird der Wert des Systems Timing/Zähler als zufälliger Saatgut verwendet. Daher ist in derselben Plattformumgebung nach dem Kompilieren und Generieren eines EXE jedes Mal, wenn Sie sie ausführen, die angezeigte Zufallszahl eine Pseudo-Random-Nummer, dh die angezeigten Ergebnisse unterscheiden sich jedes Mal, wenn Sie sie ausführen.
Zusammenfassen
Zufällige Zahlen sind Werte, die nach zufälligen Saatgut berechnet werden, die auf bestimmten Berechnungsmethoden basieren. Solange die Berechnungsmethode sicher ist und der zufällige Saatgut sicher ist, ändert sich die generierte Zufallszahl nicht. In derselben Plattformumgebung sind nach dem Kompilieren und Generieren eines EXE die angezeigten Zufallszahlen jedes Mal gleich, wenn Sie sie ausführen. Dies liegt daran, dass in derselben Umgebung mit Kompilierungsplattform die Berechnungsmethoden zur Erzeugung von Zufallszahlen aus zufälligen Samen gleich sind und die zufälligen Samen gleich sind, sodass die generierten zufälligen Zahlen gleich sind.
Solange der Benutzer oder der Dritte keinen zufälligen Saatgut festlegt, stammt standardmäßig der zufällige Saatgut aus der Systemuhr (d. H. Der Wert des Timings/Zählers).
Danke fürs Lesen, ich hoffe, es kann Ihnen helfen. Vielen Dank für Ihre Unterstützung für diese Seite!