分析講解Java?Random類里的種子問(wèn)題
可以說(shuō)在現(xiàn)在的計(jì)算機(jī)語(yǔ)言里面,以及普通用戶這里,都是沒(méi)有辦法獲得真正的 隨機(jī)數(shù)的。真正的隨機(jī)數(shù)現(xiàn)在也只有在量子計(jì)算機(jī)當(dāng)中才有獲得。
所以我們現(xiàn)在所說(shuō)的隨機(jī)數(shù),也可以稱為偽隨機(jī)數(shù),偽隨機(jī)數(shù)是通過(guò)一種算法并且結(jié)合當(dāng)下一個(gè)有規(guī)律其不斷改變的數(shù)(比如時(shí)間)獲得的結(jié)果。
我們將這種通過(guò)算法集合時(shí)間作為初始獲得隨機(jī)數(shù)的基準(zhǔn)的數(shù)據(jù)稱為種子。
Java當(dāng)中創(chuàng)建隨機(jī)數(shù)的方式是有兩種的:
第以種就是直接創(chuàng)建Random對(duì)象
Random random = new Random();
在底層就會(huì)調(diào)用這個(gè)方法來(lái)得到種子:

第二種就是將自己創(chuàng)建的種子傳進(jìn)去:
Random random = new Random(5);

在源碼里我們可以直接看出種子的數(shù)據(jù)類型為long型,是長(zhǎng)整形。
所以我們現(xiàn)在就有一種辦法,在它最開(kāi)始生成Random對(duì)象的時(shí)候,獲得它生成的種子,然后將獲得的種子又傳入創(chuàng)建Random的對(duì)象當(dāng)中。是不是就可以獲得上面一模一樣的隨機(jī)數(shù)了?
先拿java語(yǔ)言來(lái)實(shí)現(xiàn)一下:
import java.util.Random;
public class Demo02 {
public static void main(String[] args) {
Random random = new Random(5);//在這將5作為種子傳入
System.out.println("第一次調(diào)用:");
for (int i = 0; i < 5; i++) {
System.out.print(random.nextInt(10) + "\t");
//獲得10以內(nèi)的隨機(jī)數(shù)(不包括10)
}
random.setSeed(5);//在這再將種子5傳入Random的種子當(dāng)中
System.out.println("\n第二次調(diào)用:");
for (int i = 0; i < 5; i++) {
System.out.print(random.nextInt(10) + "\t");
}
}
}

在這明顯的看出,這個(gè)隨機(jī)數(shù)是一點(diǎn)都不隨機(jī)的。兩次只要種子一樣,就能返回相同的結(jié)果。
在這我再用python語(yǔ)言在實(shí)現(xiàn)一次這個(gè)功能(主要是java當(dāng)中沒(méi)有能調(diào)用輸出當(dāng)前種子的方法)。用python有一個(gè)更好的理解。
在python里面我會(huì)更加詳細(xì)的寫(xiě)清注釋,詳細(xì)不會(huì)很難理解不了的。
import random #導(dǎo)入random內(nèi)庫(kù)
x = random.getstate() # 獲得當(dāng)前random里的種子
print('第一次循環(huán):') #輸入語(yǔ)句
for i in range(5):
#for循環(huán) for i in range(5) ===》 for (int i = 0; i < 5; i++)
#在python里面并沒(méi)喲什么大括號(hào)去吧什么括起來(lái),而是要注意鎖定,一個(gè)鎖定就是一個(gè)整體
print(random.randint(1, 10), end='\t')
#random.randint(1, 10)生成1~10(不包括10)的隨機(jī)數(shù),
# end='\t'表示當(dāng)前print沒(méi)有結(jié)束,還有一個(gè)制表符的鍵位,也就不換行了
print('\n第二次循環(huán)')
random.setstate(x)#將上面獲得的種子再次傳入進(jìn)去
for i in range(5): #這里和上面一樣,循環(huán)出5次
print(random.randint(1, 10), end='\t')

到此這篇關(guān)于分析講解Java Random類里的種子問(wèn)題的文章就介紹到這了,更多相關(guān)Java Random類種子問(wèn)題內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java編程實(shí)現(xiàn)快速排序及優(yōu)化代碼詳解
這篇文章主要介紹了Java編程實(shí)現(xiàn)快速排序及優(yōu)化代碼詳解,具有一定借鑒價(jià)值,需要的朋友可以了解下。2017-12-12
基于springboot redirect重定向路徑問(wèn)題總結(jié)
這篇文章主要介紹了springboot redirect重定向路徑問(wèn)題總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
Java 反射獲取類詳細(xì)信息的常用方法總結(jié)
Java 反射獲取類詳細(xì)信息的常用方法總結(jié),需要的朋友可以參考一下2013-03-03
Java畢業(yè)設(shè)計(jì)實(shí)戰(zhàn)之學(xué)生管理系統(tǒng)的實(shí)現(xiàn)
只學(xué)書(shū)上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+Springboot+Maven+mybatis+Vue+Mysql實(shí)現(xiàn)學(xué)生管理系統(tǒng),大家可以在過(guò)程中查缺補(bǔ)漏,提升水平2022-03-03
Java客戶端服務(wù)端上傳接收文件實(shí)現(xiàn)詳解
這篇文章主要介紹了Java客戶端服務(wù)端上傳接收文件實(shí)現(xiàn)詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07
Java 實(shí)現(xiàn)Redis存儲(chǔ)復(fù)雜json格式數(shù)據(jù)并返回給前端
這篇文章主要介紹了Java 實(shí)現(xiàn)Redis存儲(chǔ)復(fù)雜json格式數(shù)據(jù)并返回給前端操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-07-07
使用java的Calendar對(duì)象獲得當(dāng)前日期
本文給大家分享的是使用使用java的Calendar對(duì)象獲得當(dāng)前日期的上幾個(gè)度開(kāi)始、結(jié)束時(shí)間,主要思路是先獲得當(dāng)前季度的開(kāi)始和結(jié)束日期,在當(dāng)前日期的基礎(chǔ)上往前推3個(gè)月即上個(gè)季度的開(kāi)始和結(jié)束日期,十分的實(shí)用,小伙伴們可以參考下。2015-07-07
Spring集成MyBatis?及Aop分頁(yè)的實(shí)現(xiàn)代碼
這篇文章主要介紹了Spring集成MyBatis?及Aop分頁(yè)的實(shí)現(xiàn),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04
springboot執(zhí)行延時(shí)任務(wù)之DelayQueue實(shí)例
這篇文章主要介紹了springboot執(zhí)行延時(shí)任務(wù)之DelayQueue實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02

