濮阳杆衣贸易有限公司

主頁 > 知識庫 > GoLang 中的隨機數(shù)的示例代碼

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

熱門標簽:釘釘有地圖標注功能嗎 濱州自動電銷機器人排名 浙江高頻外呼系統(tǒng)多少錢一個月 黃岡人工智能電銷機器人哪個好 鄭州亮點科技用的什么外呼系統(tǒng) 建造者2地圖標注 惠州電銷防封電話卡 阿里云ai電話機器人 汕頭小型外呼系統(tǒng)

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

偽隨機數(shù)

我們都知道“隨機數(shù)”在現(xiàn)實生活中的概念,可能你隨手拋一個硬幣,就可以說其結果是隨機的,但是在計算機中要確定一個“隨機數(shù)”真的是“隨機數(shù)”,那可是有標準的,不是你隨隨便便說是就是。

根據(jù)密碼學原理,要想對一個“隨機數(shù)”進行隨機性檢驗有以下幾個標準:

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

根據(jù)以上幾個標準,其對應的隨機數(shù)也就分為以下幾類:

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

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

偽隨機數(shù)生成器

在實際應用中大部分情況下偽隨機數(shù)就足夠了。這些數(shù)列是“似乎”隨機的數(shù),實際上它們是通過一個固定的、可以重復的計算方法產生的。因為它們實際上是可以計算出來的,所以它們并不真正地隨機,但是它們具有類似于隨機數(shù)的統(tǒng)計特征。產生這樣的結果的生成器我們叫做偽隨機數(shù)生成器。

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

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

GoLang 中的偽隨機數(shù)

在 GoLang 中,我們可以通過 math/rand 包里的方法來生成一個偽隨機數(shù):

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

上面的代碼中,我們通過 rand.Int() 方法來生成一個偽隨機數(shù)??雌饋砗孟駴]什么問題嘛,人家也很 OK 啦。

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

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

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

隨機種子

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

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

這個“開始值”,就被稱為隨機種子。

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

而這個 default Source ,我們從Seed 部分可以看到,如果你沒有設置隨機種子,那么默認初始種子總是從 1 開始。

既然隨機種子一樣,那自然其結果也是一樣的。

隨機的偽隨機數(shù)

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

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

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

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

真隨機數(shù)

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

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

上面的程序每次運行的結果都是不一樣的,會真正隨機的生成隨機數(shù)。

訪問:https://github.com/sqrthree/sqrthree.github.io/issues

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • Go語言實現(xiàn)互斥鎖、隨機數(shù)、time、List
  • Go語言排序算法之插入排序與生成隨機數(shù)詳解
  • 利用Golang生成整數(shù)隨機數(shù)方法示例
  • Golang編程實現(xiàn)生成n個從a到b不重復隨機數(shù)的方法
  • go語言返回1-99之間隨機數(shù)的方法
  • Go語言生成隨機數(shù)的方法
  • 在Go中創(chuàng)建隨機的安全密碼

標簽:駐馬店 東營 晉中 泰安 阿壩 瀘州 滄州 昭通

巨人網絡通訊聲明:本文標題《GoLang 中的隨機數(shù)的示例代碼》,本文關鍵詞  GoLang,中的,隨機數(shù),的,示例,;如發(fā)現(xiàn)本文內容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內容系統(tǒng)采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《GoLang 中的隨機數(shù)的示例代碼》相關的同類信息!
  • 本頁收集關于GoLang 中的隨機數(shù)的示例代碼的相關信息資訊供網民參考!
  • 推薦文章
    武强县| 横山县| 繁峙县| 禄丰县| 淮南市| 垫江县| 从江县| 临汾市| 德安县| 信丰县| 瓦房店市| 武定县| 乌苏市| 沂南县| 仁化县| 子洲县| 板桥市| 岑溪市| 高尔夫| 柳林县| 康乐县| 屏边| 毕节市| 蒙自县| 通化县| 崇明县| 华阴市| 栾川县| 东源县| 安乡县| 牙克石市| 尼木县| 新干县| 盐源县| 宿州市| 正镶白旗| 尼玛县| 英山县| 加查县| 武穴市| 湘潭市|