每日一個 Golang Packages 06/13 math.rand

Aliliin發表於2020-06-13

2020/06/11

package main

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

func main() {
    /**
    官方介紹
      隨機數由源生成。頂級函式。
      例如 Float64和 Int,使用預設的共享 Source,它在每次執行程式時生成確定的值序列。
      如果每次執行需要不同的行為,則使用 Seed 函式初始化預設 Source。
      預設 Source 對於多個 goroutine 併發使用是安全的,但 NewSource 建立的 Sources 則不是。
    */

    //Seed 使用提供的種子值將預設的 Source 初始化為確定性狀態。
    //如果不呼叫Seed,生成器的行為就像被Seed(1)播種一樣。種子值在除以2³¹-1時有相同的餘數,會產生相同的偽隨機序列。
    // Seed與Rand.Seed方法不同,併發使用是安全的
    rand.Seed(time.Now().Unix())

    // 非負的 int 隨機值,返回值為int
    fmt.Println(rand.Int()) // 8118193344438388970
    // [0,100)的隨機值,返回值為int
    fmt.Println(rand.Intn(100)) // 58
    // 非負的偽隨機31位整數,返回值為 int32
    fmt.Println(rand.Int31()) // 1430627247
    // [0,10)的隨機值,返回值為 int32 [0,n ]
    fmt.Println(rand.Int31n(10)) // 5
    // 32位float隨機值,返回值為 float32 [0.0,1.0]
    fmt.Println(rand.Float32()) // 0.5671139
    // 64位float隨機值,返回值為 float64 [0.0,1.0]
    fmt.Println(rand.Float64()) // 0.6571823688532759
    // 如果要產生負數到正數的隨機值,只需要將生成的隨機數減去相應數值即可 [-5, 5)的隨機值
    fmt.Println(rand.Intn(5) - 5) // 2

    // Rand 也可以使用物件的方式
    R := rand.New(rand.NewSource(time.Now().Unix()))
    // [0,10)的隨機值,返回值為int
    fmt.Println(R.Intn(10))
    // [0,10)的隨機值,返回值為int32
    fmt.Println(R.Int31n(10))
    // 32位 float 隨機值,返回值為float32
    fmt.Println(R.Float32())
    // 64位 float 隨機值,返回值為float64
    fmt.Println(R.Float64())
    // [-5, 5)的隨機值
    fmt.Println(R.Intn(5) - 5)
}

順便佛系一下用 go 做做 leetcode 的練習題同步到了 GitHub 大家也可以看看。

一步一個腳印,穩紮穩打,重新出發!從基本的 Golang Packages 記憶開始,堅持 ing!

本作品採用《CC 協議》,轉載必須註明作者和本文連結

高永立

相關文章