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

go語言生成隨機數(shù)和隨機字符串的實現(xiàn)方法

 更新時間:2021年12月08日 15:12:53   作者:kuteng  
隨機數(shù)在很多時候都可以用到,尤其是登錄時,本文就詳細的介紹一下go語言生成隨機數(shù)和隨機字符串的實現(xiàn)方法,具有一定的參考價值,感興趣的可以了解一下

生成隨機數(shù)

隨機數(shù)的生成是計算機科學(xué)的一個研究領(lǐng)域,同時也是一種藝術(shù)。這是因為計算機是純粹的邏輯機器,所以使用計算機生成隨機數(shù)異常困難!

你可以用 math/rand 包來生成隨機數(shù)。開始生成隨機數(shù)之前首先需要一個種子,種子用于整個過程的初始化,它相當重要。因為如果你每次都用同樣的種子初始化,那么就總是會得到相同的隨機數(shù)序列。這意味著每個人都可以重新生成同一個序列,那這個序列就根本不能再算是隨機的了!

我們將用來生成隨機數(shù)的程序名為 randomNumbers.go,下面分成四個部分進行介紹。這個程序需要幾個參數(shù),分別是生成隨機數(shù)的下限、生成隨機數(shù)的上限、生成隨機數(shù)的數(shù)量。如果你還用了第四個命令參數(shù),那么程序會將它作為隨機數(shù)生成器的種子。在測試的時候,你就可以再次使用這個參數(shù)生成相同的數(shù)列。

程序的第一部分如下所示:

package main

import (
    "fmt"
    "math/rand"
    "os"
    "strconv"
    "time"
)

func random(min, max int) int {
    return rand.Intn(max-min) + min
}

random() 函數(shù)完成了所有的工作,它通過根據(jù)指定的范圍調(diào)用 rand.Intn() 生成隨機數(shù)。

這個命令行程序的第二部分如下:

func main() {
    MIN := 0
    MAX := 100
    TOTAL := 100
    SEED := time.Now().Unix()

    arguments := os.Args

這一部分對程序中將會用到的變量進行了初始化。

randomNumbers.go 的第三部分包含如下的 Go 代碼:

    switch len(arguments) {
    case 2:
        fmt.Println("Usage: ./randomNumbers MIN MAX TOTAL SEED")
        MIN, _ = strconv.Atoi(arguments[1])
        MAX = MIN + 100
    case 3:
        fmt.Println("Usage: ./randomNumbers MIN MAX TOTAL SEED")
        MIN, _ = strconv.Atoi(arguments[1])
        MAX, _ = strconv.Atoi(arguments[2])
    case 4:
        fmt.Println("Usage: ./randomNumbers MIN MAX TOTAL SEED")
        MIN, _ = strconv.Atoi(arguments[1])
        MAX, _ = strconv.Atoi(arguments[2])
        TOTAL, _ = strconv.Atoi(arguments[3])
    case 5:
        MIN, _ = strconv.Atoi(arguments[1])
        MAX, _ = strconv.Atoi(arguments[2])
        TOTAL, _ = strconv.Atoi(arguments[3])
        SEED, _ = strconv.ParseInt(arguments[4], 10, 64)
    default:
        fmt.Println("Using default values!")
    }

switch 代碼塊背后的邏輯相對簡單:根據(jù)命令行參數(shù)的數(shù)量決定程序中的參數(shù)是使用缺省的默認值還是使用用戶提供的值。為了簡化程序,strconv.Atoi() 和 strconv.ParseInt() 函數(shù)返回的 error 參數(shù)使用下劃線字符接收,然后被忽略。如果是商業(yè)程序就千萬不能忽略 strconv.Atoi() 和 strconv.ParseInt() 函數(shù)返回的 error 參數(shù)!

最后,使用 strconv.ParseInt() 對 SEED 變量賦新的值是因為 rand.Seed() 函數(shù)要求的參數(shù)類型是 int64。strconv.ParseInt() 的第一個參數(shù)是要解析的字符串,第二個參數(shù)是輸出數(shù)的基數(shù),第三個參數(shù)是輸出數(shù)的位數(shù)。由于我們想要生成的是一個 64 位的十進制整數(shù),所以使用 10 作為基數(shù),使用 64 作為位數(shù)。注意,如果你想解析無符號的整數(shù)的話應(yīng)該使用 strconv.ParseUint() 函數(shù)代替。

randomNumbers.go 的最后一部分是如下的 Go 代碼:

    rand.Seed(SEED)
    for i := 0; i < TOTAL; i++ {
        myrand := random(MIN, MAX)
        fmt.Print(myrand)
        fmt.Print(" ")
    }
    fmt.Println()
}

除了使用 Unix 時間戳作為隨機數(shù)生成器的種子,你還可以使用 /dev/random 這個系統(tǒng)設(shè)備。你可以在第 8 章“Go Unix系統(tǒng)編程”中了解 /dev/random 的相關(guān)內(nèi)容。

執(zhí)行 randomNumbers.go 將會生成如下輸出:

$ go run randomNumbers.go
75 69 15 75 62 67 64 8 73 1 83 92 7 34 8 70 22 58 38 8 54 91 65 1 50 76 5 82 61 90 10 38 40 63 6 28 51 54 49 27 52 92 76 35 44 9 66 76 90 10 29 22 20 83 33 92 80 50 62 26 19 45 56 75 40 30 97 23 87 10 43 11 42 65 80 82 25 53 27 51 99 88 53 36 37 73 52 61 4 81 71 57 30 72 51 55 62 63 79
$ go run randomNumbers.go 1 3 2
Usage: ./randomNumbers MIN MAX TOTAL SEED
1 1 
$ go run randomNumbers.go 1 3 2
Usage: ./randomNumbers MIN MAX TOTAL SEED
2 2
$ go run randomNumbers.go 1 5 10 10
3 1 4 4 1 1 4 4 4 3
$ go run randomNumbers.go 1 5 10 10
3 1 4 4 1 1 4 4 4 3

如果你對隨機數(shù)生成真的很有興趣,那么你應(yīng)該先讀一下 Donald E.Knuth 寫的 The Art of Computer Programming (Addison-Wesley Professional, 2011) 的第二卷。

如果需要用 Go 生成更安全的隨機數(shù)的話,你可以使用 crypto/rand 包。這個包中實現(xiàn)了滿足密碼學(xué)安全的偽隨機數(shù)生成器。你可以在 https://golang.org/pkg/crypto/rand/ 文檔頁面了解更多關(guān)于 crypto/rand 包的信息。

生成隨機字符串

一旦你知道了計算機是如何呈現(xiàn)出單個字符,從隨機數(shù)過渡到隨機字符串就不難了。這一節(jié)將會介紹如何使用前一節(jié)中 randomNumbers.go 的代碼生成難以猜出的密碼。用于完成這個任務(wù)的 Go 程序叫做 generatePassword.go,下面將分四個部分進行介紹。這個程序只需要一個命令行參數(shù),就是你需要生成的密碼的長度。

generatePassword.go 的第一部分包含如下的 Go 代碼:

package main

import (
    "fmt"
    "math/rand"
    "os"
    "strconv"
    "time"
)

func random(min, max int) int {
    return rand.Intn(max-min) + min
}

generatePassword.go 的第二個代碼段如下:

func main() {
    MIN := 0
    MAX := 94
    SEED := time.Now().Unix()
    var LENGTH int64 = 8

    arguments := os.Arg

我們只想得到可打印的 ASCII 字符,所以對生成隨機數(shù)的范圍進行了限制。ASCII 字符表中可打印的字符一共有 94 個。這意味著該程序生成的隨機數(shù)的范圍應(yīng)該是從 0 到 94 且不包括 94。

generatePassword.go 的第三個代碼段如下:

    switch len(arguments) {
    case 2:
        LENGTH, _ = strconv.ParseInt(os.Args[1], 10, 64)
    default:
        fmt.Println("Using default values!")
    }

       rand.Seed(SEED)

generatePassword.go 的最后一部分如下:

    startChar := "!"
    var i int64 = 1
    for {
        myRand := random(MIN, MAX)
        newChar := string(startChar[0] + byte(myRand))
        fmt.Print(newChar)
        if i == LENGTH {
            break
        }
        i++
    }
    fmt.Println()
}

startChar 參數(shù)保存了這個程序可以生成的第一個 ASCII 字符,也就是十進制 ASCII 值為 33 的感嘆號。已知該程序生成的隨機數(shù)小于 94,可以計算出生成的最大的 ASCII 值為 93 + 33,等于 126,也就是 ~ 的 ASCII 值。下面的輸出是含有十進制數(shù)值的 ASCII 字符表:

The decimal set:

? 0 nul??? 1 soh??? 2 stx??? 3 etx??? 4 eot??? 5 enq??? 6 ack??? 7 bel
? 8 bs???? 9 ht??? 10 nl??? 11 vt??? 12 np??? 13 cr??? 14 so??? 15 si
?16 dle?? 17 dc1?? 18 dc2?? 19 dc3?? 20 dc4?? 21 nak?? 22 syn?? 23 etb
?24 can?? 25 em??? 26 sub?? 27 esc?? 28 fs??? 29 gs??? 30 rs??? 31 us
?32 sp??? 33? !??? 34? "??? 35? #??? 36? $??? 37? %??? 38? &??? 39? '
?40? (??? 41? )??? 42? *??? 43? +??? 44? ,??? 45? -??? 46? .??? 47? /
?48? 0??? 49? 1??? 50? 2??? 51? 3??? 52? 4??? 53? 5??? 54? 6??? 55? 7
?56? 8??? 57? 9??? 58? :??? 59? ;??? 60? <??? 61? =??? 62? >??? 63? ?
?64? @??? 65? A??? 66? B??? 67? C??? 68? D??? 69? E??? 70? F??? 71? G
?72? H??? 73? I??? 74? J??? 75? K??? 76? L??? 77? M??? 78? N??? 79? O
?80? P??? 81? Q??? 82? R??? 83? S??? 84? T??? 85? U??? 86? V??? 87? W
?88? X??? 89? Y??? 90? Z??? 91? [??? 92? \??? 93? ]??? 94? ^??? 95? _
?96? `??? 97? a??? 98? b??? 99? c?? 100? d?? 101? e?? 102? f?? 103? g
104? h?? 105? i?? 106? j?? 107? k?? 108? l?? 109? m?? 110? n?? 111? o
112? p?? 113? q?? 114? r?? 115? s?? 116? t?? 117? u?? 118? v?? 119? w
120? x?? 121? y?? 122? z?? 123? {?? 124? |?? 125? }?? 126? ~?? 127 del

在你最喜歡的 Unix shell 中輸入 man ascii 就能生成易讀的 ASCII 字符表。

執(zhí)行 generatePassword.go 并傳入合適的命令行參數(shù)將生成如下輸出:

$ go run generatePassword.go
Using default values!
ugs$5mv1
$ go run generatePassword.go
Using default values!
PA/8hA@?
$ go run generatePassword.go 20
HBR+=3\UA'B@ExT4QG|o
$ go run generatePassword.go 20
XLcr|R{*pX/::'t2u^T'

到此這篇關(guān)于go語言生成隨機數(shù)和隨機字符串的實現(xiàn)方法的文章就介紹到這了,更多相關(guān)go語言生成隨機數(shù)和隨機字符串內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解Golang中Requests包的使用

    詳解Golang中Requests包的使用

    Go的net/http包雖然功能強大、用途也廣告,但要想正確的使用請求的客戶端是非常繁瑣的,所以本文和大家分享一個高效的HTTP的請求包carlmjohnson/requests的使用,需要的小伙伴可以了解一下
    2023-06-06
  • Golang中ringbuffer的實現(xiàn)與應(yīng)用場景詳解

    Golang中ringbuffer的實現(xiàn)與應(yīng)用場景詳解

    ringbuffer因為它能復(fù)用緩沖空間,通常用于網(wǎng)絡(luò)通信連接的讀寫,雖然市面上已經(jīng)有了go寫的諸多版本的ringbuffer組件,但還是自己造一個吧
    2023-06-06
  • MacOS下本地golang環(huán)境搭建詳細教程

    MacOS下本地golang環(huán)境搭建詳細教程

    這篇文章主要介紹了MacOS下本地golang環(huán)境搭建詳細教程,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • Go語言跨平臺時字符串中的換行符如何統(tǒng)一?

    Go語言跨平臺時字符串中的換行符如何統(tǒng)一?

    本文介紹了Go語言中統(tǒng)一換行符的方法,包括使用`strings.ReplaceAll`函數(shù)將Windows風格的換行符`\r\n`替換為Unix風格的換行符`\n`,或?qū)\n`替換為`\r\n`,統(tǒng)一換行符可以避免不同平臺間顯示不一致、傳輸時出現(xiàn)多余的換行符或丟失換行符,以及解析錯誤等問題
    2024-11-11
  • Go擴展原語之SingleFlight的用法詳解

    Go擴展原語之SingleFlight的用法詳解

    Go語言擴展包同步原語singleflight.Group能夠再一個服務(wù)中抑制對下游的多次重復(fù)請求,它能夠限制對同一個鍵值對的多次重復(fù)請求,減少對下游的瞬時流量,接下來小編就給大家講講Go SingleFlight的具體用法,需要的朋友可以參考下
    2023-07-07
  • golang模板template自定義函數(shù)用法示例

    golang模板template自定義函數(shù)用法示例

    這篇文章主要介紹了golang模板template自定義函數(shù)用法,結(jié)合實例形式分析了Go語言模板自定義函數(shù)的基本定義與使用方法,需要的朋友可以參考下
    2016-07-07
  • Go語言Zap日志庫使用教程

    Go語言Zap日志庫使用教程

    在項目開發(fā)中,經(jīng)常需要把程序運行過程中各種信息記錄下來,有了詳細的日志有助于問題排查和功能優(yōu)化;但如何選擇和使用性能好功能強大的日志庫,這個就需要我們從多角度考慮
    2023-02-02
  • Golang并發(fā)之RWMutex的用法詳解

    Golang并發(fā)之RWMutex的用法詳解

    在?Go?語言中,RWMutex?是一種讀寫互斥鎖的實現(xiàn),它提供了一種簡單有效的方式來管理對共享資源的并發(fā)訪問。本文就來和大家詳細聊聊RWMutex的用法吧
    2023-04-04
  • Go語言使用Json的方法實現(xiàn)

    Go語言使用Json的方法實現(xiàn)

    本文主要介紹了Go語言使用Json的方法實現(xiàn)
    2024-05-05
  • Golang原生rpc(rpc服務(wù)端源碼解讀)

    Golang原生rpc(rpc服務(wù)端源碼解讀)

    本文主要介紹了Golang原生rpc(rpc服務(wù)端源碼解讀),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04

最新評論

合川市| 康平县| 泸溪县| 揭西县| 铁力市| 昌邑市| 高州市| 广平县| 竹山县| 宣武区| 香港| 措勤县| 罗山县| 手机| 上杭县| 望谟县| 疏勒县| 黎城县| 海盐县| 韶关市| 海宁市| 余干县| 张家界市| 延寿县| 肥西县| 兴化市| 济宁市| 肇庆市| 达尔| 阿拉善左旗| 分宜县| 上高县| 兴和县| 绥德县| 绥宁县| 赣州市| 宜兰市| 西林县| 大丰市| 图片| 东乡族自治县|