最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

GoLang 中的隨機(jī)數(shù)的示例代碼

 更新時(shí)間:2018年03月21日 10:39:04   作者:根號(hào)三  
本篇文章主要介紹了GoLang 中的隨機(jī)數(shù)的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

隨機(jī)數(shù)我們都知道,就是計(jì)算機(jī)通過(guò)某種算法,“隨機(jī)”的生成一個(gè)數(shù)字。很多編程語(yǔ)言都有內(nèi)置的方法來(lái)生成隨機(jī)數(shù),那么 GoLang 中是怎樣一種情況呢?

偽隨機(jī)數(shù)

我們都知道“隨機(jī)數(shù)”在現(xiàn)實(shí)生活中的概念,可能你隨手拋一個(gè)硬幣,就可以說(shuō)其結(jié)果是隨機(jī)的,但是在計(jì)算機(jī)中要確定一個(gè)“隨機(jī)數(shù)”真的是“隨機(jī)數(shù)”,那可是有標(biāo)準(zhǔn)的,不是你隨隨便便說(shuō)是就是。

根據(jù)密碼學(xué)原理,要想對(duì)一個(gè)“隨機(jī)數(shù)”進(jìn)行隨機(jī)性檢驗(yàn)有以下幾個(gè)標(biāo)準(zhǔn):

  1. 統(tǒng)計(jì)學(xué)偽隨機(jī)性 - 在給定的隨機(jī)比特流樣本中,1 的數(shù)量大致等于 0 的數(shù)量,也就是說(shuō),“10”“01”“00”“11” 四者數(shù)量大致相等。說(shuō)人話就是:“一眼看上去是隨機(jī)的”。
  2. 密碼學(xué)安全偽隨機(jī)性 - 就是給定隨機(jī)樣本的一部分和隨機(jī)算法,不能有效的演算出隨機(jī)樣本的剩余部分。
  3. 真隨機(jī)性 - 其定義為隨機(jī)樣本不可重現(xiàn)。

根據(jù)以上幾個(gè)標(biāo)準(zhǔn),其對(duì)應(yīng)的隨機(jī)數(shù)也就分為以下幾類:

  1. 偽隨機(jī)數(shù) - 滿足第一個(gè)條件的隨機(jī)數(shù)。
  2. 密碼學(xué)安全的偽隨機(jī)數(shù) - 同時(shí)滿足前兩個(gè)條件的隨機(jī)數(shù)??梢酝ㄟ^(guò)密碼學(xué)安全偽隨機(jī)數(shù)生成器計(jì)算得出。
  3. 真隨機(jī)數(shù) -同時(shí)滿足三個(gè)條件的隨機(jī)數(shù)。

了解了以上幾個(gè)概念,我們就知道了“偽隨機(jī)數(shù)”其實(shí)就是一個(gè)“看似隨機(jī),實(shí)則并不真正隨機(jī)”的數(shù)字。

偽隨機(jī)數(shù)生成器

在實(shí)際應(yīng)用中大部分情況下偽隨機(jī)數(shù)就足夠了。這些數(shù)列是“似乎”隨機(jī)的數(shù),實(shí)際上它們是通過(guò)一個(gè)固定的、可以重復(fù)的計(jì)算方法產(chǎn)生的。因?yàn)樗鼈儗?shí)際上是可以計(jì)算出來(lái)的,所以它們并不真正地隨機(jī),但是它們具有類似于隨機(jī)數(shù)的統(tǒng)計(jì)特征。產(chǎn)生這樣的結(jié)果的生成器我們叫做偽隨機(jī)數(shù)生成器。

一般只有在密碼學(xué)場(chǎng)景中,我們才需要使用“真隨機(jī)數(shù)”。

在大部分編程語(yǔ)言中,提供的都是“偽隨機(jī)數(shù)生成器”,例如 JS 中的 Math.random() , GoLang 中的 math/rand 包。

GoLang 中的偽隨機(jī)數(shù)

在 GoLang 中,我們可以通過(guò) math/rand 包里的方法來(lái)生成一個(gè)偽隨機(jī)數(shù):

package main
import (
 "fmt"
 "math/rand"
)
func main() {
 fmt.Println(rand.Int())  // => 134020434
}

上面的代碼中,我們通過(guò) rand.Int() 方法來(lái)生成一個(gè)偽隨機(jī)數(shù)??雌饋?lái)好像沒(méi)什么問(wèn)題嘛,人家也很 OK 啦。

但是細(xì)心的你會(huì)發(fā)現(xiàn),你在自己電腦上運(yùn)行上面的代碼竟然和我的一樣。無(wú)論你怎么運(yùn)行,它都一樣。

我們知道 JS 中的 Math.random() 每次都會(huì)返回一個(gè)不一樣的數(shù)字,但是 GoLang 中的偽隨機(jī)數(shù)生成器默認(rèn)情況下竟然會(huì)返回相同的數(shù)值,這還不反了天了?

都是偽隨機(jī)數(shù)生成器,為什么差別就這么大呢?這里我們就要了解一下“隨機(jī)種子”的概念啦。

隨機(jī)種子

我們知道,偽隨機(jī)數(shù),是使用一個(gè)確定性的算法計(jì)算出來(lái)的似乎是隨機(jī)的數(shù)序,因此偽隨機(jī)數(shù)實(shí)際上并不隨機(jī)。

那么自然,在計(jì)算偽隨機(jī)數(shù)時(shí)假如使用的開(kāi)始值不變的話,那么算法計(jì)算出的偽隨機(jī)數(shù)的數(shù)序自然也是不變的咯。

這個(gè)“開(kāi)始值”,就被稱為隨機(jī)種子。

查閱文檔,我們得知, Int() 函數(shù)是從 default Source (默認(rèn)源)中產(chǎn)生的偽隨機(jī)數(shù)。

而這個(gè) default Source ,我們從Seed 部分可以看到,如果你沒(méi)有設(shè)置隨機(jī)種子,那么默認(rèn)初始種子總是從 1 開(kāi)始。

既然隨機(jī)種子一樣,那自然其結(jié)果也是一樣的。

隨機(jī)的偽隨機(jī)數(shù)

我們已經(jīng)知道了默認(rèn)隨機(jī)種子是從 1 開(kāi)始,那么我們只要在每次生成隨機(jī)數(shù)之前先設(shè)置一個(gè)不一樣的種子,那么其結(jié)果自然也就不一樣了。

我們要盡可能保證每次偽隨機(jī)數(shù)生成器工作時(shí)使用的是不同的種子,通常的做法是采用當(dāng)前時(shí)間作為種子。

package main
import (
 "fmt"
 "math/rand"
 "time"
)
func main() {
 rand.Seed(int64(time.Now().UnixNano()))
 fmt.Println(rand.Int())
}

這樣,由于種子不同,我們每次運(yùn)行的結(jié)果也就不一樣。我們就能達(dá)到獲取偽隨機(jī)數(shù)的目的啦。

真隨機(jī)數(shù)

如果我們的應(yīng)用對(duì)安全性要求比較高,需要使用真隨機(jī)數(shù)的話,那么可以使用 crypto/rand 包中的方法。

package main
import (
 "crypto/rand"
 "fmt"
 "math/big"
)
func main() {
 // 生成 20 個(gè) [0, 100) 范圍的真隨機(jī)數(shù)。
 for i := 0; i < 20; i++ {
  result, _ := rand.Int(rand.Reader, big.NewInt(100))
  fmt.Println(result)
 }
}

上面的程序每次運(yùn)行的結(jié)果都是不一樣的,會(huì)真正隨機(jī)的生成隨機(jī)數(shù)。

訪問(wèn):https://github.com/sqrthree/sqrthree.github.io/issues

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解Golang中interface{}的注意事項(xiàng)

    詳解Golang中interface{}的注意事項(xiàng)

    學(xué)習(xí)?golang?,對(duì)于?interface{}?接口類型,我們一定繞不過(guò),這篇文章咱們就來(lái)一起來(lái)看看?使用?interface{}?的時(shí)候,都有哪些注意事項(xiàng)吧
    2023-03-03
  • go mod更新指定的tag的包后,go vendor內(nèi)容未更新問(wèn)題

    go mod更新指定的tag的包后,go vendor內(nèi)容未更新問(wèn)題

    這篇文章主要介紹了go mod更新指定的tag的包后,go vendor內(nèi)容未更新問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Go Uber靜態(tài)分析工具NilAway使用初體驗(yàn)

    Go Uber靜態(tài)分析工具NilAway使用初體驗(yàn)

    這篇文章主要介紹了Go Uber靜態(tài)分析工具NilAway使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • 一文帶你了解如何正確理解和使用Golang中nil

    一文帶你了解如何正確理解和使用Golang中nil

    在?Golang?中,nil?是一個(gè)預(yù)定義的標(biāo)識(shí)符,在不同的上下文環(huán)境中有不同的含義,但通常表示“無(wú)”、“空”或“零值”,本文主要來(lái)帶大家了解下nil的正確使用,需要的可以參考下
    2023-12-12
  • go?test?命令示例詳解

    go?test?命令示例詳解

    go?test是Go用來(lái)執(zhí)行測(cè)試函數(shù)(test?function)、基準(zhǔn)函數(shù)(benchmark?function)和示例函數(shù)(example?function)的命令,這篇文章主要介紹了go?test?命令,需要的朋友可以參考下
    2023-11-11
  • Go中函數(shù)的使用細(xì)節(jié)與注意事項(xiàng)詳解

    Go中函數(shù)的使用細(xì)節(jié)與注意事項(xiàng)詳解

    在Go語(yǔ)言中函數(shù)可是一等的(first-class)公民,函數(shù)類型也是一等的數(shù)據(jù)類型,下面這篇文章主要給大家介紹了關(guān)于Go中函數(shù)的使用細(xì)節(jié)與注意事項(xiàng)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-11-11
  • Go標(biāo)準(zhǔn)庫(kù)http?server優(yōu)雅啟動(dòng)深入理解

    Go標(biāo)準(zhǔn)庫(kù)http?server優(yōu)雅啟動(dòng)深入理解

    這篇文章主要介紹了Go標(biāo)準(zhǔn)庫(kù)http?server優(yōu)雅啟動(dòng)深入理解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • 通過(guò)示例深度理解Go channel range

    通過(guò)示例深度理解Go channel range

    這篇文章主要為大家介紹了Go channel range使用示例深度理解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • 揭秘Go Json.Unmarshal精度丟失之謎

    揭秘Go Json.Unmarshal精度丟失之謎

    我們知道在json反序列化時(shí)是沒(méi)有整型和浮點(diǎn)型的區(qū)別,數(shù)字都使用同一種類型,在go語(yǔ)言的類型中這種共同類型就是float64,下面我們就來(lái)探討一下Json.Unmarshal精度丟失之謎吧
    2023-08-08
  • Go開(kāi)源項(xiàng)目分布式唯一ID生成系統(tǒng)

    Go開(kāi)源項(xiàng)目分布式唯一ID生成系統(tǒng)

    這篇文章主要為大家介紹了Go開(kāi)源項(xiàng)目分布式唯一ID生成系統(tǒng)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06

最新評(píng)論

荣成市| 资阳市| 桃源县| 平南县| 临江市| 虞城县| 武宁县| 禹州市| 德清县| 扶绥县| 增城市| 城口县| 古丈县| 盘山县| 西乡县| 成都市| 绩溪县| 喜德县| 锡林郭勒盟| 仁寿县| 长汀县| 泸西县| 丰台区| 大兴区| 法库县| 巨野县| 竹溪县| 进贤县| 涪陵区| 余庆县| 连平县| 襄城县| 常德市| 广饶县| 双城市| 阿拉善左旗| 永兴县| 睢宁县| 拉孜县| 宜春市| 密云县|