可以說在現在的電腦語言裡面,以及一般使用者這裡,都是沒有辦法獲得真正的 隨機數的。真正的隨機數現在也只有在量子電腦當中才有獲得。
所以我們現在所說的隨機數,也可以稱為偽隨機數,偽隨機數是透過一種演算法並且結合當下一個有規律其不斷改變的數(例如時間)所獲得的結果。
我們將這種透過演算法集合時間作為初始獲得隨機數的基準的資料稱為種子。
Java當中創建隨機數的方式是有兩種的:
第以種就是直接創建Random物件
Random random = new Random();
在底層就會呼叫這個方法來得到種子:
第二種就是將自己創建的種子傳進去:
Random random = new Random(5);
在原始碼裡我們可以直接看出種子的資料型態為long型,是長整形。
所以我們現在就有一種辦法,在它最開始生成Random對象的時候,獲得它生成的種子,然後將獲得的種子又傳入創建Random的對象當中。是不是就可以獲得上面一模一樣的隨機數字了?
先拿java語言來實現一下:
import java.util.Random; public class Demo02 { public static void main(String[] args) { Random random = new Random(5);//在这将5作为种子传入 System.out.println("第一次调用:"); for (int i = 0; i < 5; i++) { System.out.print(random.nextInt(10) + "\t"); //获得10以内的随机数(不包括10) } random.setSeed(5);//在这再将种子5传入Random的种子当中 System.out.println("\n第二次调用:"); for (int i = 0; i < 5; i++) { System.out.print(random.nextInt(10) + "\t"); } } }
#在這明顯的看出,這個隨機數字是一點都不隨機的。兩次只要種子一樣,就能回到相同的結果。
在這我再用python語言在實作一次這個功能(主要是java當中沒有能呼叫輸出目前種子的方法)。用python有一個更好的理解。
在python裡面我會更詳細的寫清註釋,詳細不會很難理解不了的。
import random #导入random内库 x = random.getstate() # 获得当前random里的种子 print('第一次循环:') #输入语句 for i in range(5): #for循环 for i in range(5) ===》 for (int i = 0; i < 5; i++) #在python里面并没哟什么大括号去吧什么括起来,而是要注意锁定,一个锁定就是一个整体 print(random.randint(1, 10), end='\t') #random.randint(1, 10)生成1~10(不包括10)的随机数, # end='\t'表示当前print没有结束,还有一个制表符的键位,也就不换行了 print('\n第二次循环') random.setstate(x)#将上面获得的种子再次传入进去 for i in range(5): #这里和上面一样,循环出5次 print(random.randint(1, 10), end='\t')
以上是Java Random類別裡的種子問題怎麼解決的詳細內容。更多資訊請關注PHP中文網其他相關文章!