Bagaimana dan prinsip angka acak di java
Periksa informasi yang terkait dengan nomor acak dan atur secara khusus
Pertama, mari kita bicara tentang beberapa cara untuk menghasilkan angka acak di Java
En. . . Bahkan, metode ketiga di atas digunakan untuk menghasilkan angka acak dalam metode konstruksi default acak.
Ada dua cara untuk membangun kelas acak dalam metode 2: dengan biji dan tanpa biji
Tanpa biji: Metode ini akan mengembalikan angka acak, dan hasil dari setiap proses berbeda, yang setara dengan menggunakan System.currentTimemillis () sebagai biji.
Dengan Seeds: Dengan cara ini, hasil pengembalian akan sama tidak peduli berapa kali program dijalankan. Jika dua instance acak dibuat dengan benih yang sama, urutan panggilan metode yang sama dilakukan untuk setiap instance dan mereka akan menghasilkan dan mengembalikan urutan angka yang sama.
Nomor pseudo-acak
Angka acak di komputer adalah angka pseudo-acak
Berikut adalah program C seperti ini:
// rand_1.cpp#termasuk <stdlib.h> static unsigned int rand_seed; unsigned int random (void) {rand_seed = (rand_seed*123+59)%65536; return (rand_seed);} void random_start (void) {int temp [2]; dipindahkan (0x0040,0x006c, fp_seg (temp), fp_off (temp), 4); Rand_seed = temp [0];} void main () {unsigned int i, n; acak_start (); untuk (i = 0; i <10; i ++) printf ("#u/t", acak ()); printf ("/n");} Ini sepenuhnya menjelaskan proses pembuatan angka acak:
Pertama,
dipindahkan (0x0040,0x006c, fp_seg (temp), fp_off (temp), 4);
Fungsi ini digunakan untuk memindahkan data memori. FP_SEG (Far Pointer to Segment) adalah fungsi yang mengambil alamat segmen dari array temp, FP_OFF (pointer jauh untuk diimbangi) adalah fungsi yang mengambil alamat relatif dari array temp, dan fungsi yang dipindahkan adalah untuk meletakkan kata -kata ganda yang terletak di 0040: 006ch unit penyimpanan ke dalam dua unit memori yang diuraikan oleh array. Dengan cara ini, nomor 16-bit di 0040: 006ch dapat dikirim ke Rand_seed melalui array temp.
Kedua,
Rand_seed = (rand_seed*123+59)%65536;
Ini adalah metode yang digunakan untuk menghitung angka acak. Metode perhitungan angka acak berbeda di komputer yang berbeda, bahkan dalam sistem operasi yang berbeda yang diinstal di komputer yang sama. Saya masing -masing telah mencobanya di Linux dan Windows. Angka acak yang dihasilkan oleh biji acak yang sama dalam dua sistem operasi ini berbeda, yang berarti bahwa mereka memiliki metode perhitungan yang berbeda.
Kemudian,
dipindahkan (0x0040,0x006c, fp_seg (temp), fp_off (temp), 4);
Mengapa biji acak perlu diambil pada 0040: 006ch dalam memori? Apa yang disimpan di 0040: 006ch?
Mereka yang telah mempelajari kursus "prinsip -prinsip komponen komputer dan teknologi antarmuka" mungkin ingat bahwa ketika menyusun program layanan interupsi jam BIOS BIOS, waktu/penghitung Intel 8253 digunakan. Komunikasi dengan chip interupsi Intel 8259 memungkinkan program layanan interupsi untuk beroperasi. The 18.2 interupsi yang dihasilkan oleh motherboard per detik dihasilkan oleh prosesor mengontrol chip interupsi berdasarkan nilai waktu/penghitung. Ada waktu/penghitung seperti motherboard komputer kita untuk menghitung waktu sistem saat ini. Penghitung akan ditambahkan satu setiap kali siklus sinyal jam berlalu. Di mana nilai penghitung ini disimpan? Itu benar, tepat di 0040: 006ch dalam memori, ruang memori ini sebenarnya didefinisikan seperti ini:
Timer_low dw ?; Alamat adalah 0040: 006ch
Timer_high dw ?; Alamat adalah 0040: 006eh
Timer_oft DB? ; Alamat adalah 0040: 0070h
Dalam program layanan interupsi jam, kapan pun Timer_low berubah penuh, penghitung juga akan berubah penuh, dan nilai penghitungnya adalah nol, yaitu biner 16-bit di Timer_low adalah nol, dan timer_high ditambahkan satu. di rand01.c
dipindahkan (0x0040,0x006c, fp_seg (temp), fp_off (temp), 4);
Justru dua bilangan biner 16-bit Timer_low dan timer_high yang ditempatkan ke dalam array temp dan dikirim ke rand_seed, sehingga mendapatkan "benih acak".
Sekarang, satu hal yang dapat ditentukan adalah bahwa benih acak berasal dari jam sistem, atau lebih tepatnya, nilai catatan dalam memori dari waktu/penghitung pada motherboard komputer.
En ... tidak terakhir. . LVL--
Mari kita lihat sepotong kode lain:
//rand_2.cpp#include <ioStream> #include <Cstdlib> Menggunakan namespace std; int main () {srand ((unsigned) time (null)); Int R = Rand () yang tidak ditandatangani; cout << "r =" << r << endl; // Menurut standar C ++ 98, fungsi utama dapat diperkenalkan tanpa menggunakan pernyataan pengembalian untuk mengembalikan 0;} Di sini, jika pengguna dan program lain tidak menetapkan benih acak, nilai waktu/penghitung sistem digunakan sebagai benih acak. Oleh karena itu, dalam lingkungan platform yang sama, setelah menyusun dan menghasilkan EXE, setiap kali Anda menjalankannya, nomor acak yang ditampilkan akan menjadi angka pseudo-acak, yaitu, hasil yang ditampilkan akan berbeda setiap kali Anda menjalankannya.
Meringkaskan
Angka acak adalah nilai yang dihitung dengan biji acak berdasarkan metode perhitungan tertentu. Oleh karena itu, selama metode perhitungan pasti dan benih acak pasti, angka acak yang dihasilkan tidak akan berubah. Dalam lingkungan platform yang sama, setelah menyusun dan menghasilkan EXE, angka acak yang ditampilkan adalah sama setiap kali Anda menjalankannya. Ini karena dalam lingkungan platform kompilasi yang sama, metode perhitungan untuk menghasilkan angka acak dari biji acak adalah sama, dan biji acaknya sama, sehingga angka acak yang dihasilkannya sama.
Selama pengguna atau pihak ketiga tidak menetapkan benih acak, kemudian secara default benih acak berasal dari jam sistem (mis. Nilai waktu/penghitung)
Terima kasih telah membaca, saya harap ini dapat membantu Anda. Terima kasih atas dukungan Anda untuk situs ini!