版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第golang中隨機數(shù)rand的使用目錄1、math/rand2、crypto/rand
1、math/rand
隨機數(shù)從資源生成。包水平的函數(shù)都使用的默認的公共資源。
該資源會在程序每次運行時都產(chǎn)生確定的序列。如果需要每次運行產(chǎn)生不同的序列,應(yīng)使用Seed函數(shù)進行初始化。默認資源可以安全的用于多go程并發(fā)。
關(guān)于種子seed
程序啟動的時候,種子的初始值是一樣的,也就是說隨機數(shù)是一樣的,什么意思呢?
packagemain
import(
"fmt"
"math/rand"
funcmain(){
data:=rand.Int63n(100)
fmt.Println(data)
每次運行g(shù)orunmain.go
打印的都是10
如果我們播放種子
packagemain
import(
"fmt"
"math/rand"
"time"
funcmain(){
rand.Seed(time.Now().Unix())//unix時間戳,秒
data:=rand.Int63n(100)
fmt.Println(data)
}
這樣每次執(zhí)行g(shù)orunmain.go
打印的結(jié)果就不一樣,但是,根據(jù)隨機數(shù)的特性,如果兩次執(zhí)行的時間戳是在同一秒,那么打印的結(jié)果是相同的。
以上的隨機數(shù)相同的情況是發(fā)生在程序啟動的時候,如果程序啟動后,每次生成隨機數(shù)會怎樣呢?
packagemain
import(
"fmt"
"math/rand"
funcmain(){
fori:=0;ii++{
data:=rand.Int63n(100)
fmt.Println(data)
}
運行g(shù)orunmain.go
打印
10
51
21
51
37
再次運行g(shù)orunmain.go
打印
10
51
21
51
37
可見每次啟動的結(jié)果是一樣的;但是程序啟動后,每次的隨機數(shù)都不盡相同,是隨機的。
如果再加上種子呢?
packagemain
import(
"fmt"
"math/rand"
"time"
funcmain(){
fori:=0;ii++{
rand.Seed(time.Now().Unix())//unix時間戳,秒
data:=rand.Int63n(100)
fmt.Println(data)
}
運行g(shù)orunmain.go
打印
86
86
86
86
86
再次運行g(shù)orunmain.go
打印
72
72
72
72
72
每次啟動程序,因為種子不一樣,所以隨機數(shù)不一樣;但是程序啟動后,每次也都是播放種子,秒級時間戳,如果時間戳一樣,就導致種子一樣,生成的隨機數(shù)就一樣,所以五次的隨機數(shù)是一樣的。
通過上面的例子??梢灾?,播放種子不是必須的,除非要求每次啟動程序的時候隨機數(shù)不一樣。
并且,要設(shè)置種子的情況下,應(yīng)該放在整個程序啟動的時候,而且只需要設(shè)置一次即可。修改上面的例子:
packagemain
import(
"fmt"
"math/rand"
"time"
funcmain(){
rand.Seed(time.Now().UnixNano())//納秒時間戳
fori:=0;ii++{
data:=rand.Int63n(100)
fmt.Println(data)
}
運行g(shù)orunmain.go
打印
3
49
46
83
25
再次運行g(shù)orunmain.go
打印
39
3
14
42
65
這次就是理想的結(jié)果了。使用納秒時間戳基本就沒問題了,因為我們的程序幾乎不會在1納秒時間內(nèi)多次啟動的。
下面來講講rand包的具體用法
rand包提供了兩塊的內(nèi)容,一塊是基于Rand結(jié)構(gòu)體及其方法;另一塊是基于Rand結(jié)構(gòu)體再封裝的可直接調(diào)用的方法rand.xxx,查看源碼就知道它們是同樣的功能。
所以,生成隨機數(shù)有兩種方式
rander:=rand.New(rand.NewSource(time.Now().UnixNano()))
n1:=rander.Intn(100)
rand.Seed(time.Now().UnixNano())
n2:=rand.Intn(100)
使用第一種方法,將rander作為包的全局變量,這樣就只會設(shè)置一次種子。
varRander=rand.New(rand.NewSource(time.Now().UnixNano()))
隨機整數(shù)
func(r*Rand)Int()int
func(r*Rand)Int31()int32
func(r*Rand)Int63()int64
func(r*Rand)Uint32()uint32
func(r*Rand)Uint64()uint64
func(r*Rand)Intn(nint)int
func(r*Rand)Int31n(nint32)int32
func(r*Rand)Int63n(nint64)int64
Int,Int31,Int63生成的數(shù)都太大,一般使用Intn,Int31n,Int63n。得到的范圍[0,n),想要得到[0,n],就要使用Intn(n+1),想要得到[10,100]的隨機數(shù),就要使用Intn(91)+10。
隨機浮點數(shù)
func(r*Rand)Float32()float32
func(r*Rand)Float64()float64
得到[0,1)之間的浮點數(shù),32單精度,64雙精度。
基于正態(tài)分布的隨機浮點數(shù)
func(r*Rand)NormFloat64()float64
基于指數(shù)分布的隨機浮點數(shù)
func(r*Rand)ExpFloat64()float64
隨機序列
func(r*Rand)Perm(nint)[]int
返回一個有n個元素的,[0,n)范圍內(nèi)整數(shù)的偽隨機排列的切片。
Rander.Perm(10)//[1804763295]
總結(jié):
packagemain
import(
"fmt"
"math/rand"
"strings"
"time"
funcmain(){
s:=RandString(10)
fmt.Println(s)
varRander=rand.New(rand.NewSource(time.Now().UnixNano()))
constletterString="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
constnumLetterString="0123456789"
//隨機生成字符串
funcRandStr(nint,letterstring)string{
str:=[]byte(letter)
res:=""
fori:=0;ii++{
res+=fmt.Sprintf("%c",str[Rander.Intn(strings.Count(letter,"")-1)])
}
returnres
funcRandNumStr(nint)string{
returnRandStr(n,numLetterString)
funcRandString(nint)string{
returnRandStr(n,letterString)
funcRandOrder(nint)string{
returntime.Now().Format("20060102150405")+RandNumStr(n)
//包含min,max
funcRandNum(min,maxint)int{
returnRander.Intn(max-min+1)+min
}
2、crypto/rand
實現(xiàn)了用于加解密的更安全的隨機數(shù)生成器。
變量varReaderio.Reader
是一個全局、共享的密碼用強隨機生成器。在Unix類型系統(tǒng)中,會從/dev/urandom讀??;而windows中會調(diào)用RtlGenRandomAPI。
提供的方法
1、返回一個基于[0,max)的隨機數(shù)
//Intreturnsauniformrandomvaluein[0,max).Itpanicsifmax=0.
funcInt(randio.Reader,max*big.Int)(n*big.Int,errerror)
示例
r,err:=rand.Int(rand.Reader,big.NewInt(100))
fmt.Println(r.Int64(),err)
2、根據(jù)指定的位數(shù)bits,返回一個數(shù),大概率是素數(shù),(不知道這個函數(shù)是干嘛用的)
//Primereturnsanumber,p,ofthegivensize,suchthatpisprime
//withhighprobability.
//Primewillreturnerrorforanyerrorreturnedbyrand.Readorifbits2.
funcPrime(randio.Reader,bitsint)(p*big.Int,errerror)
示例
p,err:=rand.Prime(rand.Reader,8)
fmt.Println(p.Int64(),err)
8個二進制位的最大值為255,此處會隨機返回小于255的素數(shù)。
3、生成隨機的二進制序列
//ReadisahelperfunctionthatcallsReader.Readusingio.ReadFull.
//Onreturn,n==len(b)ifandonlyiferr==nil.
funcRead(b[]byte)(nint,errerror){
returnio.ReadFull(Reader,b)
比如,隨機生成16個字節(jié)的數(shù)據(jù)
varb[16]byte
n,err:=rand.Read(b[:])
fmt.Println(n,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 趣味天文知識
- 職業(yè)健康風險評估方法學在化工行業(yè)中的創(chuàng)新應(yīng)用
- 2023年船企裝備行業(yè)分析報告及未來五至十年行業(yè)發(fā)展報告
- 職業(yè)安全教育培訓收獲課件
- 陽江2025年廣東陽江陽西縣溪頭鎮(zhèn)人民政府招聘治安聯(lián)防隊員筆試歷年參考題庫附帶答案詳解
- 邢臺2025年河北邢臺廣宗縣招聘事業(yè)單位工作人員10人筆試歷年參考題庫附帶答案詳解
- 菏澤2025年山東菏澤醫(yī)專附屬醫(yī)院招聘4人筆試歷年參考題庫附帶答案詳解
- 紅河2025年云南紅河金平縣招聘醫(yī)學專業(yè)大學生8人筆試歷年參考題庫附帶答案詳解
- 海南2025年海南省審計廳招聘直屬事業(yè)單位工作人員筆試歷年參考題庫附帶答案詳解
- 杭州浙江杭州市上城區(qū)望江街道辦事處編外人員招聘4人筆試歷年參考題庫附帶答案詳解
- 2026重慶高新開發(fā)建設(shè)投資集團招聘3人備考考試試題及答案解析
- 2026年度宣城市宣州區(qū)森興林業(yè)開發(fā)有限公司第一批次員工公開招聘筆試參考題庫及答案解析
- 老年人管理人員培訓制度
- 2025年湖南常德市鼎城區(qū)面向全市選調(diào)8名公務(wù)員備考題庫及答案詳解(新)
- 2026北京海淀初三上學期期末語文試卷和答案
- 2025學年度人教PEP五年級英語上冊期末模擬考試試卷(含答案含聽力原文)
- GB/T 3098.6-2023緊固件機械性能不銹鋼螺栓、螺釘和螺柱
- 公司食材配送方案
- GA/T 952-2011法庭科學機動車發(fā)動機號碼和車架號碼檢驗規(guī)程
- 教科版科學五年級下冊《生物與環(huán)境》單元教材解讀及教學建議
- 5Why分析法(經(jīng)典完整版)課件
評論
0/150
提交評論