欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

golang中隨機(jī)數(shù)rand的使用

 更新時(shí)間:2022年08月17日 09:55:29   作者:raoxiaoya  
本文主要介紹了golang中隨機(jī)數(shù)rand的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

1、math/rand

隨機(jī)數(shù)從資源生成。包水平的函數(shù)都使用的默認(rèn)的公共資源。

該資源會(huì)在程序每次運(yùn)行時(shí)都產(chǎn)生確定的序列。如果需要每次運(yùn)行產(chǎn)生不同的序列,應(yīng)使用Seed函數(shù)進(jìn)行初始化。默認(rèn)資源可以安全的用于多go程并發(fā)。

關(guān)于種子seed
程序啟動(dòng)的時(shí)候,種子的初始值是一樣的,也就是說(shuō)隨機(jī)數(shù)是一樣的,什么意思呢?

package main

import (
? ?"fmt"
? ?"math/rand"
)

func main(){
? ?data := rand.Int63n(100)
? ?fmt.Println(data)
}
?

每次運(yùn)行g(shù)o run main.go
打印的都是 10

如果我們播放種子

package main

import (
? ?"fmt"
? ?"math/rand"
? ?"time"
)

func main(){
? ?rand.Seed(time.Now().Unix()) // unix 時(shí)間戳,秒
? ?data := rand.Int63n(100)
? ?fmt.Println(data)
}

這樣每次執(zhí)行g(shù)o run main.go

打印的結(jié)果就不一樣,但是,根據(jù)隨機(jī)數(shù)的特性,如果兩次執(zhí)行的時(shí)間戳是在同一秒,那么打印的結(jié)果是相同的。
以上的隨機(jī)數(shù)相同的情況是發(fā)生在程序啟動(dòng)的時(shí)候,如果程序啟動(dòng)后,每次生成隨機(jī)數(shù)會(huì)怎樣呢?

package main

import (
? ?"fmt"
? ?"math/rand"
)

func main(){
? ?for i := 0; i<5; i++ {
? ? ? data := rand.Int63n(100)
? ? ? fmt.Println(data)
? ?}
}

運(yùn)行 go run main.go
打印
10
51
21
51
37

再次運(yùn)行 go run main.go
打印
10
51
21
51
37

可見(jiàn)每次啟動(dòng)的結(jié)果是一樣的;但是程序啟動(dòng)后,每次的隨機(jī)數(shù)都不盡相同,是隨機(jī)的。

如果再加上種子呢?

package main

import (
? ?"fmt"
? ?"math/rand"
? ?"time"
)

func main(){
? ?for i := 0; i<5; i++ {
? ? ? rand.Seed(time.Now().Unix()) // unix 時(shí)間戳,秒
? ? ? data := rand.Int63n(100)
? ? ? fmt.Println(data)
? ?}
}

運(yùn)行 go run main.go
打印
86
86
86
86
86

再次運(yùn)行 go run main.go
打印
72
72
72
72
72

每次啟動(dòng)程序,因?yàn)榉N子不一樣,所以隨機(jī)數(shù)不一樣;但是程序啟動(dòng)后,每次也都是播放種子,秒級(jí)時(shí)間戳,如果時(shí)間戳一樣,就導(dǎo)致種子一樣,生成的隨機(jī)數(shù)就一樣,所以五次的隨機(jī)數(shù)是一樣的。

通過(guò)上面的例子??梢灾溃シ欧N子不是必須的,除非要求每次啟動(dòng)程序的時(shí)候隨機(jī)數(shù)不一樣。

并且,要設(shè)置種子的情況下,應(yīng)該放在整個(gè)程序啟動(dòng)的時(shí)候,而且只需要設(shè)置一次即可。修改上面的例子:

package main

import (
? ?"fmt"
? ?"math/rand"
? ?"time"
)

func main(){
? ?rand.Seed(time.Now().UnixNano()) // 納秒時(shí)間戳
? ?for i := 0; i<5; i++ {
? ? ? data := rand.Int63n(100)
? ? ? fmt.Println(data)
? ?}
}

運(yùn)行 go run main.go
打印
3
49
46
83
25

再次運(yùn)行 go run main.go
打印
39
3
14
42
65

這次就是理想的結(jié)果了。使用納秒時(shí)間戳基本就沒(méi)問(wèn)題了,因?yàn)槲覀兊某绦驇缀醪粫?huì)在1納秒時(shí)間內(nèi)多次啟動(dòng)的。

下面來(lái)講講rand包的具體用法

rand 包提供了兩塊的內(nèi)容,一塊是基于 Rand 結(jié)構(gòu)體及其方法;另一塊是基于 Rand 結(jié)構(gòu)體再封裝的可直接調(diào)用的方法 rand.xxx,查看源碼就知道它們是同樣的功能。

所以,生成隨機(jī)數(shù)有兩種方式

rander := rand.New(rand.NewSource(time.Now().UnixNano()))
n1 := rander.Intn(100)

rand.Seed(time.Now().UnixNano())
n2 := rand.Intn(100)

使用第一種方法,將 rander 作為包的全局變量,這樣就只會(huì)設(shè)置一次種子。

var Rander = rand.New(rand.NewSource(time.Now().UnixNano()))

隨機(jī)整數(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(n int) int
func (r *Rand) Int31n(n int32) int32
func (r *Rand) Int63n(n int64) int64

Int, Int31, Int63 生成的數(shù)都太大,一般使用 Intn, Int31n, Int63n。得到的范圍 [0, n),想要得到 [0, n],就要使用 Intn(n + 1),想要得到 [10, 100] 的隨機(jī)數(shù),就要使用 Intn(91) + 10。

隨機(jī)浮點(diǎn)數(shù)

func (r *Rand) Float32() float32
func (r *Rand) Float64() float64

得到 [0, 1) 之間的浮點(diǎn)數(shù),32單精度,64雙精度。

基于正態(tài)分布的隨機(jī)浮點(diǎn)數(shù)

func (r *Rand) NormFloat64() float64

基于指數(shù)分布的隨機(jī)浮點(diǎn)數(shù)

func (r *Rand) ExpFloat64() float64

隨機(jī)序列

func (r *Rand) Perm(n int) []int

返回一個(gè)有n個(gè)元素的,[0,n)范圍內(nèi)整數(shù)的偽隨機(jī)排列的切片。

Rander.Perm(10) // [1 8 0 4 7 6 3 2 9 5]

總結(jié):

package main

import (
?? ?"fmt"
?? ?"math/rand"
?? ?"strings"
?? ?"time"
)

func main() {
?? ?s := RandString(10)
?? ?fmt.Println(s)
}

var Rander = rand.New(rand.NewSource(time.Now().UnixNano()))

const letterString = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
const numLetterString = "0123456789"

// 隨機(jī)生成字符串
func RandStr(n int, letter string) string {
?? ?str := []byte(letter)
?? ?res := ""
?? ?for i := 0; i < n; i++ {
?? ??? ?res += fmt.Sprintf("%c", str[Rander.Intn(strings.Count(letter, "") - 1)])
?? ?}
?? ?return res
}

func RandNumStr(n int) string {
?? ?return RandStr(n, numLetterString)
}

func RandString(n int) string {
?? ?return RandStr(n, letterString)
}

func RandOrder(n int) string {
?? ?return time.Now().Format("20060102150405") + RandNumStr(n)
}

// 包含min, max
func RandNum(min , max int) int {
?? ?return Rander.Intn(max - min + 1) + min
}

2、crypto/rand

實(shí)現(xiàn)了用于加解密的更安全的隨機(jī)數(shù)生成器。

變量 var Reader io.Reader
是一個(gè)全局、共享的密碼用強(qiáng)隨機(jī)生成器。在Unix類(lèi)型系統(tǒng)中,會(huì)從/dev/urandom讀取;而windows中會(huì)調(diào)用RtlGenRandom API。

提供的方法

1、返回一個(gè)基于[0, max)的隨機(jī)數(shù)

// Int returns a uniform random value in [0, max). It panics if max <= 0.
func Int(rand io.Reader, max *big.Int) (n *big.Int, err error)

示例

r, err := rand.Int(rand.Reader, big.NewInt(100))
fmt.Println(r.Int64(), err)

2、根據(jù)指定的位數(shù)bits,返回一個(gè)數(shù),大概率是素?cái)?shù),(不知道這個(gè)函數(shù)是干嘛用的)

// Prime returns a number, p, of the given size, such that p is prime
// with high probability.
// Prime will return error for any error returned by rand.Read or if bits < 2.
func Prime(rand io.Reader, bits int) (p *big.Int, err error)

示例

p, err := rand.Prime(rand.Reader, 8)
fmt.Println(p.Int64(), err)

8個(gè)二進(jìn)制位的最大值為255,此處會(huì)隨機(jī)返回小于255的素?cái)?shù)。

3、生成隨機(jī)的二進(jìn)制序列

// Read is a helper function that calls Reader.Read using io.ReadFull.
// On return, n == len(b) if and only if err == nil.
func Read(b []byte) (n int, err error) {
    return io.ReadFull(Reader, b)
}

比如,隨機(jī)生成16個(gè)字節(jié)的數(shù)據(jù)

var b [16]byte
n, err := rand.Read(b[:])
fmt.Println(n, err)
fmt.Println(b)

返回值
16 <nil>
[94 184 113 36 224 18 239 52 69 242 14 84 174 113 125 15]

我們可以將其轉(zhuǎn)換成16進(jìn)制數(shù),也就是32位

buf := make([]byte, 32)
hex.Encode(buf, b[:])
fmt.Println(string(buf))

得到
5eb87124e012ef3445f20e54ae717d0f

通過(guò)這個(gè)方法可以生成隨機(jī)的字符串。

到此這篇關(guān)于golang中隨機(jī)數(shù)rand的使用的文章就介紹到這了,更多相關(guān)golang隨機(jī)數(shù)rand內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • GoLand一鍵上傳項(xiàng)目到遠(yuǎn)程服務(wù)器的方法步驟

    GoLand一鍵上傳項(xiàng)目到遠(yuǎn)程服務(wù)器的方法步驟

    我們開(kāi)發(fā)項(xiàng)目常常將項(xiàng)目上傳到linux遠(yuǎn)程服務(wù)器上來(lái)運(yùn)行,本文主要介紹了GoLand一鍵上傳項(xiàng)目到遠(yuǎn)程服務(wù)器的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • Golang泛型實(shí)現(xiàn)類(lèi)型轉(zhuǎn)換的方法實(shí)例

    Golang泛型實(shí)現(xiàn)類(lèi)型轉(zhuǎn)換的方法實(shí)例

    將一個(gè)值從一種類(lèi)型轉(zhuǎn)換到另一種類(lèi)型,便發(fā)生了類(lèi)型轉(zhuǎn)換,下面這篇文章主要給大家介紹了關(guān)于Golang泛型實(shí)現(xiàn)類(lèi)型轉(zhuǎn)換的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-12-12
  • Golang實(shí)現(xiàn)對(duì)map的并發(fā)讀寫(xiě)的方法示例

    Golang實(shí)現(xiàn)對(duì)map的并發(fā)讀寫(xiě)的方法示例

    這篇文章主要介紹了Golang實(shí)現(xiàn)對(duì)map的并發(fā)讀寫(xiě)的方法示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-03-03
  • Go中使用操作符進(jìn)行數(shù)學(xué)運(yùn)算的示例代碼

    Go中使用操作符進(jìn)行數(shù)學(xué)運(yùn)算的示例代碼

    在編程中有效地執(zhí)行數(shù)學(xué)運(yùn)算是一項(xiàng)需要開(kāi)發(fā)的重要技能,本文主要介紹了Go中使用操作符進(jìn)行數(shù)學(xué)運(yùn)算的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10
  • Golang實(shí)現(xiàn)密碼加密的示例詳解

    Golang實(shí)現(xiàn)密碼加密的示例詳解

    數(shù)據(jù)庫(kù)在存儲(chǔ)密碼時(shí),不能明文存儲(chǔ),需要加密后存儲(chǔ),而Golang中的加密算法有很多種,下面小編就來(lái)通過(guò)簡(jiǎn)單的示例和大家簡(jiǎn)單聊聊吧
    2023-07-07
  • 用GO實(shí)現(xiàn)IP門(mén)禁優(yōu)化網(wǎng)絡(luò)流量管理

    用GO實(shí)現(xiàn)IP門(mén)禁優(yōu)化網(wǎng)絡(luò)流量管理

    這篇文章主要為大家介紹了用GO實(shí)現(xiàn)IP門(mén)禁優(yōu)化網(wǎng)絡(luò)流量管理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • golang值接收者和指針接收者的區(qū)別介紹

    golang值接收者和指針接收者的區(qū)別介紹

    這篇文章主要介紹了golang值接收者和指針接收者的區(qū)別,它和函數(shù)的區(qū)別在于方法有一個(gè)接收者,給一個(gè)函數(shù)添加一個(gè)接收者,那么它就變成了方法,接收者可以是值接收者,也可以是指針接收者,本文通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • golang中接口對(duì)象的轉(zhuǎn)型兩種方式

    golang中接口對(duì)象的轉(zhuǎn)型兩種方式

    這篇文章主要介紹了golang中接口對(duì)象的轉(zhuǎn)型方式,大家都知道接口對(duì)象的轉(zhuǎn)型有兩種方式,文中通過(guò)示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2021-10-10
  • golang?Gin上傳文件返回前端及中間件實(shí)現(xiàn)示例

    golang?Gin上傳文件返回前端及中間件實(shí)現(xiàn)示例

    這篇文章主要為大家介紹了golang?Gin上傳文件返回前端及中間件實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • golang 歸并排序,快速排序,堆排序的實(shí)現(xiàn)

    golang 歸并排序,快速排序,堆排序的實(shí)現(xiàn)

    本文主要介紹了golang 歸并排序,快速排序,堆排序的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01

最新評(píng)論