golang中隨機數(shù)rand的使用_第1頁
golang中隨機數(shù)rand的使用_第2頁
golang中隨機數(shù)rand的使用_第3頁
golang中隨機數(shù)rand的使用_第4頁
golang中隨機數(shù)rand的使用_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論